summaryrefslogtreecommitdiffstats
path: root/misc-utils
diff options
context:
space:
mode:
authorKarel Zak2018-10-16 13:37:36 +0200
committerKarel Zak2018-12-07 12:32:57 +0100
commite2d7870b00e3bc47b0c8f767f33d6db402ba7f66 (patch)
tree91d8e7a3172d77546043421f227dfb3b65d78e81 /misc-utils
parentlsblk: process_one_device() refactoring (diff)
downloadkernel-qcow2-util-linux-e2d7870b00e3bc47b0c8f767f33d6db402ba7f66.tar.gz
kernel-qcow2-util-linux-e2d7870b00e3bc47b0c8f767f33d6db402ba7f66.tar.xz
kernel-qcow2-util-linux-e2d7870b00e3bc47b0c8f767f33d6db402ba7f66.zip
lsblk: add lsblk_device_has_dependence()
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils')
-rw-r--r--misc-utils/lsblk-devtree.c37
-rw-r--r--misc-utils/lsblk.h3
2 files changed, 29 insertions, 11 deletions
diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c
index cc0134d03..5bef44be0 100644
--- a/misc-utils/lsblk-devtree.c
+++ b/misc-utils/lsblk-devtree.c
@@ -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;
diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h
index 6c095246d..cce1a29f2 100644
--- a/misc-utils/lsblk.h
+++ b/misc-utils/lsblk.h
@@ -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);