diff options
author | Karel Zak | 2018-10-15 14:14:33 +0200 |
---|---|---|
committer | Karel Zak | 2018-12-07 12:32:57 +0100 |
commit | 57502dd34c532b679b3e1fe36f5a2a5fc47faf3a (patch) | |
tree | 91c61aed1faffff6504b2b3d0123604842da1cc1 /misc-utils | |
parent | lsblk: split sysfs reading and scols table filling (diff) | |
download | kernel-qcow2-util-linux-57502dd34c532b679b3e1fe36f5a2a5fc47faf3a.tar.gz kernel-qcow2-util-linux-57502dd34c532b679b3e1fe36f5a2a5fc47faf3a.tar.xz kernel-qcow2-util-linux-57502dd34c532b679b3e1fe36f5a2a5fc47faf3a.zip |
lsblk: fix devtree deallocation
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils')
-rw-r--r-- | misc-utils/lsblk-devtree.c | 16 | ||||
-rw-r--r-- | misc-utils/lsblk.c | 5 |
2 files changed, 6 insertions, 15 deletions
diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c index c84ccde73..cc0134d03 100644 --- a/misc-utils/lsblk-devtree.c +++ b/misc-utils/lsblk-devtree.c @@ -23,7 +23,6 @@ struct lsblk_device *lsblk_new_device(struct lsblk_devtree *tree) dev->refcount = 1; dev->tree = tree; - lsblk_ref_devtree(dev->tree); INIT_LIST_HEAD(&dev->deps); INIT_LIST_HEAD(&dev->ls_roots); @@ -68,7 +67,7 @@ static int device_remove_dependences(struct lsblk_device *dev) void lsblk_unref_device(struct lsblk_device *dev) { - if (dev) + if (!dev) return; if (--dev->refcount <= 0) { @@ -77,16 +76,12 @@ void lsblk_unref_device(struct lsblk_device *dev) device_remove_dependences(dev); lsblk_device_free_properties(dev->properties); - if (dev->tree) - lsblk_devtree_remove_device(dev->tree, dev); - free(dev->name); free(dev->dm_name); free(dev->filename); free(dev->mountpoint); ul_unref_path(dev->sysfs); - lsblk_ref_devtree(dev->tree); free(dev); } @@ -165,21 +160,16 @@ void lsblk_ref_devtree(struct lsblk_devtree *tr) void lsblk_unref_devtree(struct lsblk_devtree *tr) { - if (tr) + if (!tr) return; if (--tr->refcount <= 0) { DBG(TREE, ul_debugobj(tr, "dealloc")); - while (!list_empty(&tr->roots)) { - struct lsblk_device *dev = list_entry(tr->roots.next, - struct lsblk_device, ls_roots); - lsblk_unref_device(dev); - } while (!list_empty(&tr->devices)) { struct lsblk_device *dev = list_entry(tr->devices.next, struct lsblk_device, ls_devices); - lsblk_unref_device(dev); + lsblk_devtree_remove_device(tr, dev); } free(tr); } diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c index 748e3cc34..edc9a20e0 100644 --- a/misc-utils/lsblk.c +++ b/misc-utils/lsblk.c @@ -1301,7 +1301,7 @@ static int iterate_block_devices(struct lsblk_devtree *tr) continue; } lsblk_devtree_add_device(tr, dev); - lsblk_unref_device(dev); + lsblk_unref_device(dev); /* keep it referenced by devtree only */ } else DBG(DEV, ul_debug(" %s: already processed", d->d_name)); @@ -1525,7 +1525,7 @@ static void check_sysdevblock(void) int main(int argc, char *argv[]) { struct lsblk _ls = { .sort_id = -1, .flags = LSBLK_TREE }; - struct lsblk_devtree *tr; + struct lsblk_devtree *tr = NULL; int c, status = EXIT_FAILURE; char *outarg = NULL; size_t i; @@ -1850,6 +1850,7 @@ leave: lsblk_mnt_deinit(); lsblk_properties_deinit(); + lsblk_unref_devtree(tr); return status; } |