]> sourceware.org Git - lvm2.git/commitdiff
dev-cache: replace inefficient looking for dev
authorZdenek Kabelac <zkabelac@redhat.com>
Thu, 25 Feb 2021 23:21:41 +0000 (00:21 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Tue, 2 Mar 2021 21:54:40 +0000 (22:54 +0100)
Use btree loopkup to find dev structure by major:minor.
This could have slow down lvm2 commands significantly with
higher amount of LVs.

lib/device/dev-cache.c

index 8dd069c79fd7d67c1e122180e0cb233d70b9a4eb..21c9ef0eade4417f49a790b1b8469753e5e56d7f 100644 (file)
@@ -1549,29 +1549,12 @@ struct device *dev_cache_get(struct cmd_context *cmd, const char *name, struct d
        return dev;
 }
 
-static struct device *_dev_cache_seek_devt(dev_t dev)
-{
-       struct device *d = NULL;
-       struct dm_hash_node *n = dm_hash_get_first(_cache.names);
-       while (n) {
-               d = dm_hash_get_data(_cache.names, n);
-               if (d->dev == dev)
-                       return d;
-               n = dm_hash_get_next(_cache.names, n);
-       }
-       return NULL;
-}
-
-/*
- * TODO This is very inefficient. We probably want a hash table indexed by
- * major:minor for keys to speed up these lookups.
- */
 struct device *dev_cache_get_by_devt(struct cmd_context *cmd, dev_t dev, struct dev_filter *f, int *filtered)
 {
        char path[PATH_MAX];
        const char *sysfs_dir;
        struct stat info;
-       struct device *d = _dev_cache_seek_devt(dev);
+       struct device *d = (struct device *) btree_lookup(_cache.devices, (uint32_t) dev);
        int ret;
 
        if (filtered)
@@ -1600,7 +1583,7 @@ struct device *dev_cache_get_by_devt(struct cmd_context *cmd, dev_t dev, struct
                log_debug_devs("Device num not found in dev_cache repeat dev_cache_scan for %d:%d",
                                (int)MAJOR(dev), (int)MINOR(dev));
                dev_cache_scan();
-               d = _dev_cache_seek_devt(dev);
+               d = (struct device *) btree_lookup(_cache.devices, (uint32_t) dev);
        }
 
        if (!d)
This page took 0.036496 seconds and 5 git commands to generate.