All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Introduce immediate_dev_node flag for dm tree items to support immediate node creation on demand
@ 2010-06-08 12:27 Peter Rajnoha
  2010-06-08 13:11 ` Peter Rajnoha
  2010-06-17 22:15 ` Jonathan Brassow
  0 siblings, 2 replies; 3+ messages in thread
From: Peter Rajnoha @ 2010-06-08 12:27 UTC (permalink / raw)
  To: lvm-devel

Sometimes we need the nodes to be visible in /dev/mapper even during processing a tree,
just like we need in case of processing mirrors in clustered environment by cmirror daemon
(rhbz #568137). Normally, we synchronize with udev and create nodes (as a fallback, if
udev has not done so yet) at the end of processing the whole tree only.

So let's use a flag (or "load_property") called "immediate_dev_node" for such a dm tree
node which triggers immediate synchronisation with udev and node creation when needed.

(Unfortunately, this still does not solve the problem with searching the right node
by comparing the whole /dev/mapper content since we do not have a name provided in
dm log request sent from kernel which cmirror daemon tries to process.)

Peter
---

 libdm/libdm-deptree.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index e1813b4..38565e5 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -143,6 +143,13 @@ struct load_properties {
 	struct dm_list segs;
 
 	const char *new_name;
+
+	/* If immediate_dev_node is set to 1, try to create the dev node
+	 * as soon as possible (e.g. in preload stage even during traversal
+	 * and processing of dm tree). This will also flush all stacked dev
+	 * node operations, synchronizing with udev.
+	 */
+	int immediate_dev_node;
 };
 
 /* Two of these used to join two nodes with uses and used_by. */
@@ -1843,6 +1850,7 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
 	void *handle = NULL;
 	struct dm_tree_node *child;
 	struct dm_info newinfo;
+	int update_devs_flag = 0;
 
 	/* Preload children first */
 	while ((child = dm_tree_next_child(&handle, dnode, 0))) {
@@ -1897,10 +1905,26 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
 
 		/* Update cached info */
 		child->info = newinfo;
+
+		/*
+		 * Prepare for immediate synchronization with udev and flush all stacked
+		 * dev node operations if requested by immediate_dev_node property. But
+		 * finish processing current level in the tree first.
+		 */
+		if (child->props.immediate_dev_node)
+			update_devs_flag = 1;
+
 	}
 
 	handle = NULL;
 
+	if (update_devs_flag) {
+		if (!dm_udev_wait(dm_tree_get_cookie(dnode)))
+			stack;
+		dm_tree_set_cookie(dnode, 0);
+		dm_task_update_nodes();
+	}
+
 	return r;
 }
 
@@ -2157,6 +2181,9 @@ int dm_tree_node_add_mirror_target_log(struct dm_tree_node *node,
 				return 0;
 			}
 
+			if (clustered)
+				log_node->props.immediate_dev_node = 1;
+
 			if (!_link_tree_nodes(node, log_node))
 				return_0;
 		}



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-06-17 22:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-08 12:27 [PATCH] Introduce immediate_dev_node flag for dm tree items to support immediate node creation on demand Peter Rajnoha
2010-06-08 13:11 ` Peter Rajnoha
2010-06-17 22:15 ` Jonathan Brassow

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.