]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsblk: add lsblk_device_has_dependence()
authorKarel Zak <kzak@redhat.com>
Tue, 16 Oct 2018 11:37:36 +0000 (13:37 +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-devtree.c
misc-utils/lsblk.h

index cc0134d03a65fa83687660c4a59a5b2854527d1d..5bef44be0d59cfcfd767a80aa037591000e26422 100644 (file)
@@ -41,10 +41,10 @@ void lsblk_ref_device(struct lsblk_device *dev)
 
 static int device_remove_dependence(struct lsblk_device *dev, struct lsblk_devdep *dep)
 {
-       if (!dev || !dep || !list_empty(&dev->deps))
+       if (!dev || !dep || list_empty(&dev->deps))
                return -EINVAL;
 
-       DBG(DEV, ul_debugobj(dev, "  remove-deallocate dependence 0x%p", dep));
+       DBG(DEV, ul_debugobj(dev, "  %s: deallocate dependence 0x%p [%s]", dev->name, dep, dep->child->name));
        list_del_init(&dep->ls_deps);
        lsblk_unref_device(dep->child);
        free(dep);
@@ -56,7 +56,7 @@ static int device_remove_dependences(struct lsblk_device *dev)
        if (!dev)
                return -EINVAL;
 
-       DBG(DEV, ul_debugobj(dev, "remove all depencences"));
+       DBG(DEV, ul_debugobj(dev, "%s: remove all depencences", dev->name));
        while (!list_empty(&dev->deps)) {
                struct lsblk_devdep *dp = list_entry(dev->deps.next,
                                        struct lsblk_devdep, ls_deps);
@@ -87,18 +87,34 @@ void lsblk_unref_device(struct lsblk_device *dev)
        }
 }
 
-struct lsblk_devdep *lsblk_device_new_dependence(struct lsblk_device *parent, struct lsblk_device *child)
+int lsblk_device_has_dependence(struct lsblk_device *dev, struct lsblk_device *child)
 {
-       struct lsblk_devdep *dp;
+       struct lsblk_device *x = NULL;
+       struct lsblk_iter itr;
 
-       if (!parent || !child) {
-               errno = EINVAL;
-               return NULL;
+       lsblk_reset_iter(&itr, LSBLK_ITER_FORWARD);
+
+       while (lsblk_device_next_child(dev, &itr, &x) == 0) {
+               if (x == child)
+                       return 1;
        }
 
+       return 0;
+}
+
+int lsblk_device_new_dependence(struct lsblk_device *parent, struct lsblk_device *child)
+{
+       struct lsblk_devdep *dp;
+
+       if (!parent || !child)
+               return -EINVAL;
+
+       if (lsblk_device_has_dependence(parent, child))
+               return 1;
+
        dp = calloc(1, sizeof(*dp));
        if (!dp)
-               return NULL;
+               return -ENOMEM;
 
        INIT_LIST_HEAD(&dp->ls_deps);
 
@@ -108,7 +124,7 @@ struct lsblk_devdep *lsblk_device_new_dependence(struct lsblk_device *parent, st
         DBG(DEV, ul_debugobj(parent, "add dependence 0x%p [%s->%s]", dp, parent->name, child->name));
         list_add_tail(&dp->ls_deps, &parent->deps);
 
-       return dp;
+       return 0;
 }
 
 int lsblk_device_next_child(struct lsblk_device *dev,
@@ -135,6 +151,7 @@ int lsblk_device_next_child(struct lsblk_device *dev,
        return rc;
 }
 
+
 struct lsblk_devtree *lsblk_new_devtree()
 {
        struct lsblk_devtree *tr;
index 6c095246d9ed62f5bc4e617f2d016cc34225f4f2..cce1a29f201f32b339db6712e679d8508513d03d 100644 (file)
@@ -182,7 +182,8 @@ void lsblk_reset_iter(struct lsblk_iter *itr, int direction);
 struct lsblk_device *lsblk_new_device(struct lsblk_devtree *tree);
 void lsblk_ref_device(struct lsblk_device *dev);
 void lsblk_unref_device(struct lsblk_device *dev);
-struct lsblk_devdep *lsblk_device_new_dependence(struct lsblk_device *parent, struct lsblk_device *child);
+int lsblk_device_new_dependence(struct lsblk_device *parent, struct lsblk_device *child);
+int lsblk_device_has_dependence(struct lsblk_device *dev, struct lsblk_device *child);
 int lsblk_device_next_child(struct lsblk_device *dev,
                           struct lsblk_iter *itr,
                           struct lsblk_device **child);