diff options
| author | NeilBrown <neilb@suse.de> | 2014-05-27 23:39:21 -0400 |
|---|---|---|
| committer | NeilBrown <neilb@suse.de> | 2014-05-29 02:59:30 -0400 |
| commit | bd8839e03b8e70fbbe08bbff70d8cba95273c823 (patch) | |
| tree | 29419f9639907eabb74e527fd3ed71bc08a122e9 | |
| parent | 2ac295a544dcae9299cba13ce250419117ae7fd1 (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.c | 10 |
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; |
