summaryrefslogtreecommitdiff
path: root/libdm/libdm-deptree.c
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2017-12-04 15:05:44 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2017-12-04 15:38:50 +0100
commit63368a5064dd20a1fb5a2f4110704059c79b3ced (patch)
treeedd1ac316339afe350afe01a6240820c2d52d38d /libdm/libdm-deptree.c
parentb74e7f6a781bf7dc4914d8294fcbc6881a539f2e (diff)
downloadlvm2-63368a5064dd20a1fb5a2f4110704059c79b3ced.tar.gz
libdm: watch for failing _info_by_dev
Separate handling of error code from _info_by_dev. This error can only happeng when we are running out of memory. In such case there is urgent need to stop any futher proceeding of command and run to error ASAP.
Diffstat (limited to 'libdm/libdm-deptree.c')
-rw-r--r--libdm/libdm-deptree.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 8c623bf43..ff7e9b4bc 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -1011,8 +1011,10 @@ static int _node_has_closed_parents(struct dm_tree_node *node,
return_0; /* FIXME Is this normal? */
/* Refresh open_count */
- if (!_info_by_dev(dinfo->major, dinfo->minor, 1, &info, NULL, NULL, NULL) ||
- !info.exists)
+ if (!_info_by_dev(dinfo->major, dinfo->minor, 1, &info, NULL, NULL, NULL))
+ return_0;
+
+ if (!info.exists)
continue;
if (info.open_count) {
@@ -1137,7 +1139,7 @@ static int _node_clear_table(struct dm_tree_node *dnode, uint16_t udev_flags)
if (!_info_by_dev(MAJOR(deps->device[i]), MINOR(deps->device[i]), 1,
&deps_info, dnode->dtree->mem, &name, &uuid))
- continue;
+ goto_out;
/* Proceed if device is an 'orphan' - unreferenced and without a live table. */
if (!deps_info.exists || deps_info.live_table || deps_info.open_count)
@@ -1653,8 +1655,10 @@ static int _dm_tree_deactivate_children(struct dm_tree_node *dnode,
continue;
/* Refresh open_count */
- if (!_info_by_dev(dinfo->major, dinfo->minor, 1, &info, NULL, NULL, NULL) ||
- !info.exists)
+ if (!_info_by_dev(dinfo->major, dinfo->minor, 1, &info, NULL, NULL, NULL))
+ return_0;
+
+ if (!info.exists)
continue;
if (info.open_count) {
@@ -1773,8 +1777,10 @@ int dm_tree_suspend_children(struct dm_tree_node *dnode,
if (!_children_suspended(child, 1, uuid_prefix, uuid_prefix_len))
continue;
- if (!_info_by_dev(dinfo->major, dinfo->minor, 0, &info, NULL, NULL, NULL) ||
- !info.exists || info.suspended)
+ if (!_info_by_dev(dinfo->major, dinfo->minor, 0, &info, NULL, NULL, NULL))
+ return_0;
+
+ if (!info.exists || info.suspended)
continue;
/* If child has some real messages send them */