summaryrefslogtreecommitdiff
path: root/device_mapper
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2018-06-29 17:25:38 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2018-07-02 10:25:35 +0200
commitd56e400d448c79a269591ac065e087bc2cc69609 (patch)
tree8ec5ef26eceb356b86f8da8d8a5185a3af8eddd0 /device_mapper
parentf2b856c9940cf3b4cf4bb35bf1a145a8f5f76e13 (diff)
downloadlvm2-d56e400d448c79a269591ac065e087bc2cc69609.tar.gz
device_mapper: deactive new nodes when load fails
When node loading fails, there is not much the caller can do, since there is 'unknown' set of devices preloaded. Only suspend during preload knows future precommitted 'metadata', so it's non-trivial to drop 'preloaded' entries with any later call. However dm tree tracks newly loaded entries - so in this case it may simplify the recovery path by dropping preloaded entries so they are not leaked in the DM table.
Diffstat (limited to 'device_mapper')
-rw-r--r--device_mapper/libdm-deptree.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c
index bb552b679..4609796e2 100644
--- a/device_mapper/libdm-deptree.c
+++ b/device_mapper/libdm-deptree.c
@@ -2877,8 +2877,14 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
* insufficient to remove those - only the node
* encountering the table load failure is removed.
*/
- if (node_created && !_remove_node(child))
- return_0;
+ if (node_created) {
+ if (!_remove_node(child))
+ return_0;
+ if (!dm_udev_wait(dm_tree_get_cookie(dnode)))
+ stack;
+ dm_tree_set_cookie(dnode, 0);
+ (void) _dm_tree_revert_activated(child);
+ }
return_0;
}