blob: a864f1e219f635e11e51f7a841d4d03e5db05fd9 [file] [log] [blame]
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