about summary refs log tree commit homepage
path: root/svc_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'svc_dev.c')
-rw-r--r--svc_dev.c58
1 files changed, 26 insertions, 32 deletions
diff --git a/svc_dev.c b/svc_dev.c
index 497d1bb..5d19580 100644
--- a/svc_dev.c
+++ b/svc_dev.c
@@ -38,28 +38,21 @@ static void devlist_free(void *x)
         free(devlist);
 }
 
-static size_t devid_hash(const void *x, size_t tablesize)
-{
-        const struct mog_dev *dev = x;
-
-        return dev->devid % tablesize;
-}
-
-static bool devid_cmp(const void *a, const void *b)
-{
-        const struct mog_dev *dev_a = a;
-        const struct mog_dev *dev_b = b;
-
-        return dev_a->devid == dev_b->devid;
-}
-
 static struct mog_devlist * mog_devlist_new(dev_t st_dev)
 {
         struct mog_devlist *devlist = xmalloc(sizeof(struct mog_devlist));
 
         devlist->st_dev = st_dev;
         devlist->by_mogdevid = hash_initialize(7, NULL,
-                                               devid_hash, devid_cmp, free);
+                                               mog_dev_hash, mog_dev_cmp,
+
+                                               /*
+                                                * elements are freed when
+                                                * svc->by_mog_devid is freed
+                                                */
+                                               NULL);
+
+        mog_oom_if_null(devlist->by_mogdevid);
 
         return devlist;
 }
@@ -99,8 +92,7 @@ static void svc_init_dev_hash(struct mog_svc *svc)
 
         svc->by_st_dev = hash_initialize(7, NULL, devlist_hash,
                                          devlist_cmp, devlist_free);
-        if (!svc->by_st_dev)
-                mog_oom();
+        mog_oom_if_null(svc->by_st_dev);
 }
 
 static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb)
@@ -108,9 +100,6 @@ static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb)
         struct dirent *ent;
         int rc = 0;
 
-        if (svc->mgmt_fd < 0)
-                return 0;
-
         CHECK(int, 0, pthread_mutex_lock(&svc->devstats_lock));
         svc_init_dev_hash(svc);
         rewinddir(svc->dir);
@@ -127,15 +116,17 @@ static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb)
 
                 mog_devid = strtoul(ent->d_name + 3, &end, 10);
                 if (*end != 0) continue;
-                if (mog_devid > 0xffffff) continue; /* MEDIUMINT in DB */
+                if (mog_devid > MOG_DEVID_MAX) continue;
 
-                dev = mog_dev_new(svc, (uint32_t)mog_devid);
+                dev = mog_dev_for(svc, (uint32_t)mog_devid);
                 if (!dev) continue;
 
                 devlist = svc_devlist(svc, dev->st_dev);
                 devhash = devlist->by_mogdevid;
 
-                if (cb) rc |= cb(dev, svc); /* mog_dev_mkusage */
+                if (cb)
+                        rc |= cb(dev, svc); /* mog_dev_mkusage */
+
                 switch (hash_insert_if_absent(devhash, dev, NULL)) {
                 case 0:
                         free(dev);
@@ -284,18 +275,21 @@ void mog_svc_dev_shutdown(void)
         mog_svc_each(devstats_shutdown_i, NULL);
 }
 
-static bool svc_mkusage_each(void *svc, void *nr)
+static bool svc_mkusage_each(void *svcptr, void *ignored)
 {
-        svc_scandev((struct mog_svc *)svc, nr, mog_dev_mkusage);
+        struct mog_svc *svc = svcptr;
+        size_t ndev = 0;
+
+        svc_scandev(svc, &ndev, mog_dev_mkusage);
+
+        if (svc->queue && (svc->nmogdev != ndev))
+                mog_svc_thrpool_rescale(svc, ndev);
+        svc->nmogdev = ndev;
 
         return true;
 }
 
-size_t mog_mkusage_all(void)
+void mog_mkusage_all(void)
 {
-        size_t nr = 0;
-
-        mog_svc_each(svc_mkusage_each, &nr);
-
-        return nr;
+        mog_svc_each(svc_mkusage_each, NULL);
 }