md: close some races between setting and checking sync_action.
authorNeilBrown <neilb@suse.com>
Mon, 6 Jul 2015 02:26:57 +0000 (12:26 +1000)
committerNeilBrown <neilb@suse.com>
Mon, 31 Aug 2015 17:30:40 +0000 (19:30 +0200)
When checking sync_action in a script, we want to be sure it is
as accurate as possible.
As resync/reshape etc doesn't always start immediately (a separate
thread is scheduled to do it), it is best if 'action_show'
checks if MD_RECOVER_NEEDED is set (which it does) and in that
case reports what is likely to start soon (which it only sometimes
does).

So:
 - report 'reshape' if reshape_position suggests one might start.
 - set MD_RECOVERY_RECOVER in raid1_reshape(), because that is very
   likely to happen next.

Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md.c
drivers/md/raid1.c

index 689be615d7be4ed988c6d57a069f2082d5d8797f..324f9df4e429b975e303e69ef4990d0a53ff91a3 100644 (file)
@@ -4210,6 +4210,8 @@ action_show(struct mddev *mddev, char *page)
                                type = "repair";
                } else if (test_bit(MD_RECOVERY_RECOVER, &recovery))
                        type = "recover";
+               else if (mddev->reshape_position != MaxSector)
+                       type = "reshape";
        }
        return sprintf(page, "%s\n", type);
 }
index 967a4ed73929ff44a38d9475c5e362fc2914c758..742b50794dfd6d10c9230a46ea6643fe2af4038c 100644 (file)
@@ -3113,6 +3113,7 @@ static int raid1_reshape(struct mddev *mddev)
 
        unfreeze_array(conf);
 
+       set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
        set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
        md_wakeup_thread(mddev->thread);