]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
WORKAROUND: mdadm hangs during reshape
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 26 Jan 2011 20:56:21 +0000 (07:56 +1100)
committerNeilBrown <neilb@suse.de>
Wed, 26 Jan 2011 20:56:21 +0000 (07:56 +1100)
During reshape when reshape is finished in md, progress_reshape() hangs
on select().
This is because 'sync_completed' is reset to zero before 'sync_action'
becomes 'idle', and we don't look for notification on 'sync_action'.

So if completed becomes zero after reshape_progress has made some
progress, then deduce that reshape has finished.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c

diff --git a/Grow.c b/Grow.c
index 27488b16dff57c46f03264c59056c58568d3da4a..b14d63812fbcedcf6d67b110e92713c7ea78129b 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -2425,6 +2425,17 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
                                  action, 20) <= 0 ||
                    strncmp(action, "reshape", 7) != 0)
                        break;
+               /* Some kernels reset 'sync_completed' to zero
+                * before setting 'sync_action' to 'idle'.
+                * So we need these extra tests.
+                */
+               if (completed == 0 && advancing
+                   && info->reshape_progress > 0)
+                       break;
+               if (completed == 0 && !advancing
+                   && info->reshape_progress < (info->component_size
+                                                * reshape->after.data_disks))
+                       break;
                FD_ZERO(&rfds);
                FD_SET(fd, &rfds);
                select(fd+1, NULL, NULL, &rfds, NULL);