Thread (20 messages) 20 messages, 3 authors, 2010-12-03
STALE5712d

[PATCH 02/10] FIX: Problem with removing array after takeover

From: Adam Kwolek <hidden>
Date: 2010-12-02 08:18:56
Subsystem: the rest · Maintainer: Linus Torvalds

When array parameters are changed old array 'A' is going to be removed
and new array 'B' is going to be serviced. If array B is raid0 array (takeovered),
array 'A' will never be deleted and mdmon is not going to exit.
Scenario:
1. managemon creates array 'B' and inserts it to begin of active arrays list
2. managemon sets field B->replaces = A

3. monitor: finds that array 'B' is raid 0 array and removes it from list
   information about removing array 'A' from list is lost
   and array 'A' stays in list forever

To resolve this situation first try to remove replaced arrays and then proceed
regular array servicing.

Signed-off-by: Krzysztof Wojcik <redacted>
Signed-off-by: Adam Kwolek <redacted>
---

 monitor.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/monitor.c b/monitor.c
index 59b4181..0fbe198 100644
--- a/monitor.c
+++ b/monitor.c
@@ -480,6 +480,22 @@ static int wait_and_act(struct supertype *container, int nowait)
 
 	for (ap = aap ; *ap ;) {
 		a = *ap;
+
+		/* Remove array that current array points to remove
+		 */
+		if (a->replaces && !discard_this) {
+			struct active_array **ap;
+			for (ap = &a->next; *ap && *ap != a->replaces;
+			     ap = & (*ap)->next)
+				;
+			if (*ap)
+				*ap = (*ap)->next;
+			discard_this = a->replaces;
+			a->replaces = NULL;
+			/* FIXME check if device->state_fd need to be cleared?*/
+			signal_manager();
+		}
+
 		/* once an array has been deactivated we want to
 		 * ask the manager to discard it.
 		 */
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help