]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Manage: forbid re-add to the array without metadata
authorYu Kuai <yukuai3@huawei.com>
Mon, 2 Dec 2024 01:59:11 +0000 (09:59 +0800)
committerMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Tue, 3 Dec 2024 14:55:15 +0000 (15:55 +0100)
For the build mode or external metadata, re-add is not supported,
because it will not trigger full disk recovery, user should add a new disk
to the array instead.

Also update test/05r1-re-add-nosuper to reflect this.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Manage.c
tests/05r1-re-add-nosuper

index b9e55c43a96f6154f63d72b979b5dffbbc6041b4..b14a9ab949ca57c1fb325b4912b3a027343e5f64 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -1448,6 +1448,18 @@ int Manage_subdevs(char *devname, int fd,
                int rv, err = 0;
                int mj, mn;
 
+               if (tst->ss->external && dv->disposition == 'A') {
+                       pr_err("Cannot re-add member device %s to %s, it is not supported for external metadata, aborting.\n",
+                              dv->devname, fd2devnm(fd));
+                       goto abort;
+               }
+
+               if (array.not_persistent == 1 && dv->disposition == 'A') {
+                       pr_err("Cannot re-add member device %s to %s, array is not persistent, aborting.\n",
+                              dv->devname, fd2devnm(fd));
+                       goto abort;
+               }
+
                raid_slot = -1;
                if (dv->disposition == 'c') {
                        rv = parse_cluster_confirm_arg(dv->devname, &dv->devname, &raid_slot);
index a3fa95033a6ae050ebbe859548a5e9970fff4031..750d7c1496133dea1a8fda7ea06197a13bd3b004 100644 (file)
@@ -1,7 +1,6 @@
 #
-# create a raid1, remove a drive, and readd it.
-# resync should be instant.
-# Then do some IO first.  Resync should still be very fast
+# create a raid1 without superblock, remove a drive, and readd it.
+# readd should fail.
 #
 mdadm -B $md0 -l1 -n2 -d1 $dev1 $dev2
 check resync
@@ -12,24 +11,8 @@ sleep 4
 mdadm $md0 -f $dev2
 sleep 1
 mdadm $md0 -r $dev2
-mdadm $md0 --re-add $dev2
-check nosync
+if mdadm $md0 --re-add $dev2; then
+       err "re-add should fail"
+fi
 
-mdadm $md0 -f $dev2
-sleep 1
-mdadm $md0 -r $dev2
-testdev $md0 1 $size 1
-mdadm $md0 --re-add $dev2
-check wait
-cmp --bytes=$[$mdsize0*1024] $dev1 $dev2
-
-mdadm $md0 -f $dev2; sleep 1
-mdadm $md0 -r $dev2
-if dd if=/dev/zero of=$md0 ; then : ; fi
-blockdev --flushbufs $md0 # make sure writes have been sent
-mdadm $md0 --re-add $dev2
-check recovery
-check wait
-# should BLKFLSBUF and then read $dev1/$dev2...
-cmp --bytes=$[$mdsize0*1024] $file1 $file2
 mdadm -S $md0