]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
md: refuse to change shape of array if it is active but read-only
authorNeilBrown <neilb@suse.de>
Mon, 5 May 2014 23:45:05 +0000 (09:45 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 5 May 2014 23:49:37 +0000 (09:49 +1000)
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>
drivers/md/md.c

index 237b7e0ddc7ae2617af41cb1fb9dc0cc195f44ab..f477e4ca0f786ebe526dba7d3db7380be21c22cb 100644 (file)
@@ -3448,6 +3448,8 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
                mddev->level = LEVEL_NONE;
                return rv;
        }
+       if (mddev->ro)
+               return  -EROFS;
 
        /* request to change the personality.  Need to ensure:
         *  - array is not engaged in resync/recovery/reshape
@@ -3634,6 +3636,8 @@ layout_store(struct mddev *mddev, const char *buf, size_t len)
                int err;
                if (mddev->pers->check_reshape == NULL)
                        return -EBUSY;
+               if (mddev->ro)
+                       return -EROFS;
                mddev->new_layout = n;
                err = mddev->pers->check_reshape(mddev);
                if (err) {
@@ -3723,6 +3727,8 @@ chunk_size_store(struct mddev *mddev, const char *buf, size_t len)
                int err;
                if (mddev->pers->check_reshape == NULL)
                        return -EBUSY;
+               if (mddev->ro)
+                       return -EROFS;
                mddev->new_chunk_sectors = n >> 9;
                err = mddev->pers->check_reshape(mddev);
                if (err) {
@@ -6135,6 +6141,8 @@ static int update_size(struct mddev *mddev, sector_t num_sectors)
         */
        if (mddev->sync_thread)
                return -EBUSY;
+       if (mddev->ro)
+               return -EROFS;
 
        rdev_for_each(rdev, mddev) {
                sector_t avail = rdev->sectors;
@@ -6157,6 +6165,8 @@ static int update_raid_disks(struct mddev *mddev, int raid_disks)
        /* change the number of raid disks */
        if (mddev->pers->check_reshape == NULL)
                return -EINVAL;
+       if (mddev->ro)
+               return -EROFS;
        if (raid_disks <= 0 ||
            (mddev->max_disks && raid_disks >= mddev->max_disks))
                return -EINVAL;