| From f8466749dd73f5b0ccf4fc86c8a7585c4140b3f9 Mon Sep 17 00:00:00 2001 |
| From: Zdenek Kabelac <zkabelac@redhat.com> |
| Date: Fri, 16 Aug 2019 23:49:59 +0200 |
| Subject: [PATCH 1/3] activation: add synchronization point |
| |
| Resuming of 'error' table entry followed with it's dirrect removal |
| is now troublesame with latest udev as it may skip processing of |
| udev rules for already 'dropped' device nodes. |
| |
| As we cannot 'synchronize' with udev while we know we have devices |
| in suspended state - rework 'cleanup' so it collects nodes |
| for removal into pending_delete list and process the list with |
| synchronization once we are without any suspended nodes. |
| |
| Upstream-Status: Backport |
| Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> |
| --- |
| WHATS_NEW | 9 +++++++++ |
| lib/activate/dev_manager.c | 20 ++++++++++++-------- |
| 2 files changed, 21 insertions(+), 8 deletions(-) |
| |
| diff --git a/WHATS_NEW b/WHATS_NEW |
| index 3a58de5f9..0b48e032b 100644 |
| --- a/WHATS_NEW |
| +++ b/WHATS_NEW |
| @@ -1,3 +1,12 @@ |
| +Version 2.03.06 - |
| +================================ |
| + Synchronize with udev when dropping snapshot. |
| + Add missing device synchronization point before removing pvmove node. |
| + Correctly set read_ahead for LVs when pvmove is finished. |
| + Remove unsupported OPTIONS+="event_timeout" udev rule from 11-dm-lvm.rules. |
| + Prevent creating VGs with PVs with different logical block sizes. |
| + Fix metadata writes from corrupting with large physical block size. |
| + |
| Version 2.03.05 - 15th June 2019 |
| ================================ |
| Fix command definition for pvchange -a. |
| diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c |
| index 981f4674a..7101ffa12 100644 |
| --- a/lib/activate/dev_manager.c |
| +++ b/lib/activate/dev_manager.c |
| @@ -3558,13 +3558,6 @@ static int _clean_tree(struct dev_manager *dm, struct dm_tree_node *root, const |
| const char *name, *uuid; |
| struct dm_str_list *dl; |
| |
| - /* Deactivate any tracked pending delete nodes */ |
| - dm_list_iterate_items(dl, &dm->pending_delete) { |
| - log_debug_activation("Deleting tracked UUID %s.", dl->str); |
| - if (!dm_tree_deactivate_children(root, dl->str, strlen(dl->str))) |
| - return_0; |
| - } |
| - |
| while ((child = dm_tree_next_child(&handle, root, 0))) { |
| if (!(name = dm_tree_node_get_name(child))) |
| continue; |
| @@ -3585,10 +3578,21 @@ static int _clean_tree(struct dev_manager *dm, struct dm_tree_node *root, const |
| if (non_toplevel_tree_dlid && !strcmp(non_toplevel_tree_dlid, uuid)) |
| continue; |
| |
| - if (!dm_tree_deactivate_children(root, uuid, strlen(uuid))) |
| + if (!str_list_add(dm->mem, &dm->pending_delete, uuid)) |
| return_0; |
| } |
| |
| + /* Deactivate any tracked pending delete nodes */ |
| + if (!dm_list_empty(&dm->pending_delete) && !dm_get_suspended_counter()) { |
| + fs_unlock(); |
| + dm_tree_set_cookie(root, fs_get_cookie()); |
| + dm_list_iterate_items(dl, &dm->pending_delete) { |
| + log_debug_activation("Deleting tracked UUID %s.", dl->str); |
| + if (!dm_tree_deactivate_children(root, dl->str, strlen(dl->str))) |
| + return_0; |
| + } |
| + } |
| + |
| return 1; |
| } |
| |
| -- |
| 2.21.0 |
| |