dev->refcount = 1;
dev->tree = tree;
- lsblk_ref_devtree(dev->tree);
INIT_LIST_HEAD(&dev->deps);
INIT_LIST_HEAD(&dev->ls_roots);
void lsblk_unref_device(struct lsblk_device *dev)
{
- if (dev)
+ if (!dev)
return;
if (--dev->refcount <= 0) {
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);
}
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);
}
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));
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;
lsblk_mnt_deinit();
lsblk_properties_deinit();
+ lsblk_unref_devtree(tr);
return status;
}