[lvm-devel] [PATCH] Introduce immediate_dev_node flag for dm tree items to support immediate node creation on demand
Jonathan Brassow
jbrassow at redhat.com
Thu Jun 17 22:15:06 UTC 2010
Seems like a reasonable solution to the problem we are having.
ACK
brassow
On Jun 8, 2010, at 7:27 AM, Peter Rajnoha wrote:
> 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;
> }
>
> --
> lvm-devel mailing list
> lvm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/lvm-devel
More information about the lvm-devel
mailing list