aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-05-06 22:50:57 -0400
committerNeilBrown <neilb@suse.de>2009-05-06 22:50:57 -0400
commit5bf295975416f8e97117bbbcfb0191c00bc3e2b4 (patch)
tree9d7ddfe9d4632c8d6cacb6c4dd7b9cb49f837432 /drivers/md/md.c
parent110518bccf076726cc93bf604527d8019aae50ba (diff)
md: remove ability to explicit set an inactive array to 'clean'.
Being able to write 'clean' to an 'array_state' of an inactive array to activate it in 'clean' mode is both unnecessary and inconvenient. It is unnecessary because the same can be achieved by writing 'active'. This activates and array, but it still remains 'clean' until the first write. It is inconvenient because writing 'clean' is more often used to cause an 'active' array to revert to 'clean' mode (thus blocking any writes until a 'write-pending' is promoted to 'active'). Allowing 'clean' to both activate an array and mark an active array as clean can lead to races: One program writes 'clean' to mark the active array as clean at the same time as another program writes 'inactive' to deactivate (stop) and active array. Depending on which writes first, the array could be deactivated and immediately reactivated which isn't what was desired. So just disable the use of 'clean' to activate an array. This avoids a race that can be triggered with mdadm-3.0 and external metadata, so it suitable for -stable. Reported-by: Rafal Marszewski <rafal.marszewski@intel.com> Acked-by: Dan Williams <dan.j.williams@intel.com> Cc: <stable@kernel.org> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 8350bde60d1b..1dd723d31882 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3066,11 +3066,8 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3066 } else 3066 } else
3067 err = -EBUSY; 3067 err = -EBUSY;
3068 spin_unlock_irq(&mddev->write_lock); 3068 spin_unlock_irq(&mddev->write_lock);
3069 } else { 3069 } else
3070 mddev->ro = 0; 3070 err = -EINVAL;
3071 mddev->recovery_cp = MaxSector;
3072 err = do_md_run(mddev);
3073 }
3074 break; 3071 break;
3075 case active: 3072 case active:
3076 if (mddev->pers) { 3073 if (mddev->pers) {