aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-05-27 23:39:21 -0400
committerNeilBrown <neilb@suse.de>2014-05-29 02:59:30 -0400
commitbd8839e03b8e70fbbe08bbff70d8cba95273c823 (patch)
tree29419f9639907eabb74e527fd3ed71bc08a122e9
parent2ac295a544dcae9299cba13ce250419117ae7fd1 (diff)
md: refuse to change shape of array if it is active but read-only
read-only arrays should not be changed. This includes changing the level, layout, size, or number of devices. So reject those changes for readonly arrays. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/md.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 2382cfc9bb3f..0ddf38988fbc 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3448,6 +3448,8 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
3448 mddev->level = LEVEL_NONE; 3448 mddev->level = LEVEL_NONE;
3449 return rv; 3449 return rv;
3450 } 3450 }
3451 if (mddev->ro)
3452 return -EROFS;
3451 3453
3452 /* request to change the personality. Need to ensure: 3454 /* request to change the personality. Need to ensure:
3453 * - array is not engaged in resync/recovery/reshape 3455 * - array is not engaged in resync/recovery/reshape
@@ -3634,6 +3636,8 @@ layout_store(struct mddev *mddev, const char *buf, size_t len)
3634 int err; 3636 int err;
3635 if (mddev->pers->check_reshape == NULL) 3637 if (mddev->pers->check_reshape == NULL)
3636 return -EBUSY; 3638 return -EBUSY;
3639 if (mddev->ro)
3640 return -EROFS;
3637 mddev->new_layout = n; 3641 mddev->new_layout = n;
3638 err = mddev->pers->check_reshape(mddev); 3642 err = mddev->pers->check_reshape(mddev);
3639 if (err) { 3643 if (err) {
@@ -3723,6 +3727,8 @@ chunk_size_store(struct mddev *mddev, const char *buf, size_t len)
3723 int err; 3727 int err;
3724 if (mddev->pers->check_reshape == NULL) 3728 if (mddev->pers->check_reshape == NULL)
3725 return -EBUSY; 3729 return -EBUSY;
3730 if (mddev->ro)
3731 return -EROFS;
3726 mddev->new_chunk_sectors = n >> 9; 3732 mddev->new_chunk_sectors = n >> 9;
3727 err = mddev->pers->check_reshape(mddev); 3733 err = mddev->pers->check_reshape(mddev);
3728 if (err) { 3734 if (err) {
@@ -6135,6 +6141,8 @@ static int update_size(struct mddev *mddev, sector_t num_sectors)
6135 */ 6141 */
6136 if (mddev->sync_thread) 6142 if (mddev->sync_thread)
6137 return -EBUSY; 6143 return -EBUSY;
6144 if (mddev->ro)
6145 return -EROFS;
6138 6146
6139 rdev_for_each(rdev, mddev) { 6147 rdev_for_each(rdev, mddev) {
6140 sector_t avail = rdev->sectors; 6148 sector_t avail = rdev->sectors;
@@ -6157,6 +6165,8 @@ static int update_raid_disks(struct mddev *mddev, int raid_disks)
6157 /* change the number of raid disks */ 6165 /* change the number of raid disks */
6158 if (mddev->pers->check_reshape == NULL) 6166 if (mddev->pers->check_reshape == NULL)
6159 return -EINVAL; 6167 return -EINVAL;
6168 if (mddev->ro)
6169 return -EROFS;
6160 if (raid_disks <= 0 || 6170 if (raid_disks <= 0 ||
6161 (mddev->max_disks && raid_disks >= mddev->max_disks)) 6171 (mddev->max_disks && raid_disks >= mddev->max_disks))
6162 return -EINVAL; 6172 return -EINVAL;