md: don't allow "-sync" to be set for device in an active array.
authorNeilBrown <neilb@suse.de>
Tue, 30 Sep 2014 05:24:25 +0000 (15:24 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 14 Oct 2014 02:08:29 +0000 (13:08 +1100)
If an array is active, devices can be marked 'faulty', but simply
removing the 'sync' flag is wrong.  That only makes sense
for an array which is not active (and is probably only useful
for testing anyway).

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

index 3ca611fabfaf0cb6898f6d5ab1e24a891be37b17..9939122ca00cf573669da324d362b4a504701fd9 100644 (file)
@@ -2642,10 +2642,12 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
                set_bit(In_sync, &rdev->flags);
                err = 0;
        } else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0) {
-               clear_bit(In_sync, &rdev->flags);
-               rdev->saved_raid_disk = rdev->raid_disk;
-               rdev->raid_disk = -1;
-               err = 0;
+               if (rdev->mddev->pers == NULL) {
+                       clear_bit(In_sync, &rdev->flags);
+                       rdev->saved_raid_disk = rdev->raid_disk;
+                       rdev->raid_disk = -1;
+                       err = 0;
+               }
        } else if (cmd_match(buf, "write_error")) {
                set_bit(WriteErrorSeen, &rdev->flags);
                err = 0;