* [PATCH 6/7][retry remove] Add "retry remove" support for dm trees
@ 2011-09-20 12:58 Peter Rajnoha
0 siblings, 0 replies; only message in thread
From: Peter Rajnoha @ 2011-09-20 12:58 UTC (permalink / raw)
To: lvm-devel
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)
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2011-09-20 12:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-20 12:58 [PATCH 6/7][retry remove] Add "retry remove" support for dm trees Peter Rajnoha
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.