summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Grow.c9
-rw-r--r--mdadm.c9
2 files changed, 18 insertions, 0 deletions
diff --git a/Grow.c b/Grow.c
index 75af6f3..27e0d70 100644
--- 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 0c51d63..3dc8be9 100644
--- 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");