From 63368a5064dd20a1fb5a2f4110704059c79b3ced Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Mon, 4 Dec 2017 15:05:44 +0100 Subject: [PATCH] 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. --- WHATS_NEW_DM | 1 + libdm/libdm-deptree.c | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 9cec9532a..56b8153ed 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.146 - ==================================== + Do not ignore failure of _info_by_dev(). Propagate delayed resume for pvmove subvolumes. Suppress integrity encryption keys in 'table' output unless --showkeys supplied. 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 */