]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: do not allow size changes with other changes.
authorNeilBrown <neilb@suse.de>
Fri, 6 Nov 2009 06:26:47 +0000 (17:26 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 6 Nov 2009 06:26:47 +0000 (17:26 +1100)
A change the reduces the size of an array always happens
before any other change.  So it can cause data to be lost.
By themselves these changes are reversible.  But once another
change has started, the data would be permanently lost.
So recommend data integrity be checked between a size change
and any other change.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
mdadm.c

diff --git a/Grow.c b/Grow.c
index 75af6f3a8302c6399b4c39249858721e94827134..27e0d7024c7404fac5da9c510f2057183d434c32 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -524,6 +524,15 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                return 1;
        }
 
+       if (size >= 0 &&
+           (chunksize || level!= UnSet || layout_str || raid_disks)) {
+               fprintf(stderr, Name ": cannot change component size at the same time "
+                       "as other changes.\n"
+                       "   Change size first, then check data is intact before "
+                       "making other changes.\n");
+               return 1;
+       }
+
        if (raid_disks && raid_disks < array.raid_disks && array.level > 1 &&
            get_linux_version() < 2006032 &&
            !check_env("MDADM_FORCE_FEWER")) {
diff --git a/mdadm.c b/mdadm.c
index 0c51d63867840749861342b4e9f64fede2be53a2..3dc8be950121cadb279498d787c653c70be91d76 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -1417,9 +1417,18 @@ int main(int argc, char *argv[])
                if (array_size >= 0) {
                        /* alway impose array size first, independent of
                         * anything else
+                        * Do not allow level or raid_disks changes at the
+                        * same time as that can be irreversibly destructive.
                         */
                        struct mdinfo sra;
                        int err;
+                       if (raiddisks || level != UnSet) {
+                               fprintf(stderr, Name ": cannot change array size in same operation "
+                                       "as changing raiddisks or level.\n"
+                                       "    Change size first, then check that data is still intact.\n");
+                               rv = 1;
+                               break;
+                       }
                        sysfs_init(&sra, mdfd, 0);
                        if (array_size == 0)
                                err = sysfs_set_str(&sra, NULL, "array_size", "default");