[lvm-devel] [PATCH 6/7][retry remove] Add "retry remove" support for dm trees

Peter Rajnoha prajnoha at redhat.com
Tue Sep 20 12:58:01 UTC 2011


 libdm/libdevmapper.h  |    5 +++++
 libdm/libdm-deptree.c |   17 ++++++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 9df34bb..f6614a5 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -415,6 +415,11 @@ void dm_tree_skip_lockfs(struct dm_tree_node *dnode);
 void dm_tree_use_no_flush_suspend(struct dm_tree_node *dnode);
 
 /*
+ * Retry removal of each device if not successful.
+ */
+void dm_tree_retry_remove(struct dm_tree_node *dnode);
+
+/*
  * Is the uuid prefix present in the tree?
  * Only returns 0 if every node was checked successfully.
  * Returns 1 if the tree walk has to be aborted.
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 864723d..d0b2743 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -222,7 +222,8 @@ struct dm_tree {
 	struct dm_hash_table *uuids;
 	struct dm_tree_node root;
 	int skip_lockfs;		/* 1 skips lockfs (for non-snapshots) */
-	int no_flush;		/* 1 sets noflush (mirrors/multipath) */
+	int no_flush;			/* 1 sets noflush (mirrors/multipath) */
+	int retry_remove;		/* 1 retries remove if not successful */
 	uint32_t cookie;
 };
 
@@ -982,7 +983,7 @@ static int _node_has_closed_parents(struct dm_tree_node *node,
 }
 
 static int _deactivate_node(const char *name, uint32_t major, uint32_t minor,
-			    uint32_t *cookie, uint16_t udev_flags)
+			    uint32_t *cookie, uint16_t udev_flags, int retry)
 {
 	struct dm_task *dmt;
 	int r = 0;
@@ -1005,6 +1006,10 @@ static int _deactivate_node(const char *name, uint32_t major, uint32_t minor,
 	if (!dm_task_set_cookie(dmt, cookie, udev_flags))
 		goto out;
 
+
+	if (retry)
+		dm_task_retry_remove(dmt);
+
 	r = dm_task_run(dmt);
 
 	/* FIXME Until kernel returns actual name so dm-iface.c can handle it */
@@ -1205,7 +1210,8 @@ static int _dm_tree_deactivate_children(struct dm_tree_node *dnode,
 			continue;
 
 		if (!_deactivate_node(name, info.major, info.minor,
-				      &child->dtree->cookie, child->udev_flags)) {
+				      &child->dtree->cookie, child->udev_flags,
+				      child->dtree->retry_remove)) {
 			log_error("Unable to deactivate %s (%" PRIu32
 				  ":%" PRIu32 ")", name, info.major,
 				  info.minor);
@@ -1240,6 +1246,11 @@ void dm_tree_use_no_flush_suspend(struct dm_tree_node *dnode)
 	dnode->dtree->no_flush = 1;
 }
 
+void dm_tree_retry_remove(struct dm_tree_node *dnode)
+{
+	dnode->dtree->retry_remove = 1;
+}
+
 int dm_tree_suspend_children(struct dm_tree_node *dnode,
 			     const char *uuid_prefix,
 			     size_t uuid_prefix_len)




More information about the lvm-devel mailing list