]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsblk: add devtree_get_device_or_new()
authorKarel Zak <kzak@redhat.com>
Mon, 15 Oct 2018 13:53:33 +0000 (15:53 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 7 Dec 2018 11:32:57 +0000 (12:32 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
misc-utils/lsblk.c

index c7219724b2ce182d888922ceea1037a94a677981..bb16c23c13231381d13578b33c60b09426af4fff 100644 (file)
@@ -1081,6 +1081,29 @@ static int set_device(struct lsblk_device *dev,
        return 0;
 }
 
+struct lsblk_device *devtree_get_device_or_new(struct lsblk_devtree *tr,
+                                              struct lsblk_device *parent,
+                                              struct lsblk_device *disk,
+                                              const char *name)
+{
+       struct lsblk_device *dev = lsblk_devtree_get_device(tr, name);
+
+       if (!dev) {
+               dev = lsblk_new_device(tr);
+               if (!dev)
+                       err(EXIT_FAILURE, _("failed to allocate device"));
+
+               if (set_device(dev, parent, disk, name) != 0) {
+                       lsblk_unref_device(dev);
+                       return NULL;
+               }
+               lsblk_devtree_add_device(tr, dev);
+               lsblk_unref_device(dev);                /* keep it referenced by devtree only */
+       } else
+               DBG(DEV, ul_debugobj(dev, "%s: already processed", name));
+
+       return dev;
+}
 
 static int process_dependencies(struct lsblk_device *dev, struct lsblk_device *parent,
                          int do_partitions, const char *part_name);
@@ -1271,19 +1294,9 @@ static int process_all_devices(struct lsblk_devtree *tr)
 
                DBG(DEV, ul_debug(" %s dentry", d->d_name));
 
-               dev = lsblk_devtree_get_device(tr, d->d_name);
-               if (!dev) {
-                       dev = lsblk_new_device(tr);
-                       if (!dev)
-                               err(EXIT_FAILURE, _("failed to allocate device"));
-                       if (set_device(dev, NULL, NULL, d->d_name) != 0) {
-                               lsblk_unref_device(dev);
-                               continue;
-                       }
-                       lsblk_devtree_add_device(tr, dev);
-                       lsblk_unref_device(dev);                /* keep it referenced by devtree only */
-               } else
-                       DBG(DEV, ul_debug(" %s: already processed", d->d_name));
+               dev = devtree_get_device_or_new(tr, NULL, NULL, d->d_name);
+               if (!dev)
+                       continue;
 
                /* remove unwanted devices */
                if (is_maj_excluded(dev->maj) || !is_maj_included(dev->maj)) {