md: fix up switching md arrays between read-only and read-write
When setting an array to 'readonly' or to 'active' via sysfs, we must make the appropriate set_disk_ro call too. Also when switching to "read_auto" (which is like readonly, but blocks on the first write so that metadata can be marked 'dirty') we need to be more careful about what state we are changing from. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
31a59e3425
commit
648b629ed4
@ -2594,15 +2594,20 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
|
||||
err = do_md_stop(mddev, 1);
|
||||
else {
|
||||
mddev->ro = 1;
|
||||
set_disk_ro(mddev->gendisk, 1);
|
||||
err = do_md_run(mddev);
|
||||
}
|
||||
break;
|
||||
case read_auto:
|
||||
/* stopping an active array */
|
||||
if (mddev->pers) {
|
||||
err = do_md_stop(mddev, 1);
|
||||
if (err == 0)
|
||||
mddev->ro = 2; /* FIXME mark devices writable */
|
||||
if (mddev->ro != 1)
|
||||
err = do_md_stop(mddev, 1);
|
||||
else
|
||||
err = restart_array(mddev);
|
||||
if (err == 0) {
|
||||
mddev->ro = 2;
|
||||
set_disk_ro(mddev->gendisk, 0);
|
||||
}
|
||||
} else {
|
||||
mddev->ro = 2;
|
||||
err = do_md_run(mddev);
|
||||
@ -2640,6 +2645,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
|
||||
err = 0;
|
||||
} else {
|
||||
mddev->ro = 0;
|
||||
set_disk_ro(mddev->gendisk, 0);
|
||||
err = do_md_run(mddev);
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user