]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Fix writing of second backup superblock during grow
authorNeilBrown <neilb@suse.de>
Thu, 5 Aug 2010 11:39:17 +0000 (21:39 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 5 Aug 2010 11:39:17 +0000 (21:39 +1000)
There 'rv' tests were confused and sometimes wrong.
This resulted in not writing the second bsb.

Also fix the test script so the the critical section is long enough
that we have some hope of interrupting it.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
tests/07reshape5intr

diff --git a/Grow.c b/Grow.c
index 78c3d4facba654aa3a676fda5f035a851ed496fb..37674b850e9cd71fcbd5507b60d8a18bd794be46 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1350,17 +1350,21 @@ int grow_backup(struct mdinfo *sra,
                        bsb.sb_csum2 = bsb_csum((char*)&bsb,
                                                ((char*)&bsb.sb_csum2)-((char*)&bsb));
 
+               rv = -1;
                if ((unsigned long long)lseek64(destfd[i], destoffsets[i] - 4096, 0)
                    != destoffsets[i] - 4096)
-                       rv = 1;
-               rv = rv ?: write(destfd[i], &bsb, 512);
+                       break;
+               if (write(destfd[i], &bsb, 512) != 512)
+                       break;
                if (destoffsets[i] > 4096) {
                        if ((unsigned long long)lseek64(destfd[i], destoffsets[i]+stripes*chunk*odata, 0) !=
                            destoffsets[i]+stripes*chunk*odata)
-                               rv = 1;
-                       rv = rv ?: write(destfd[i], &bsb, 512);
+                               break;
+                       if (write(destfd[i], &bsb, 512) != 512)
+                               break;
                }
                fsync(destfd[i]);
+               rv = 0;
        }
 
        return rv;
@@ -1431,8 +1435,10 @@ int wait_backup(struct mdinfo *sra,
                                                ((char*)&bsb.sb_csum2)-((char*)&bsb));
                if ((unsigned long long)lseek64(destfd[i], destoffsets[i]-4096, 0) !=
                    destoffsets[i]-4096)
-                       rv = 1;
-               rv = rv ?: write(destfd[i], &bsb, 512);
+                       rv = -1;
+               if (rv == 0 && 
+                   write(destfd[i], &bsb, 512) != 512)
+                       rv = -1;
                fsync(destfd[i]);
        }
        return rv;
@@ -1441,8 +1447,8 @@ int wait_backup(struct mdinfo *sra,
 static void fail(char *msg)
 {
        int rv;
-       rv = write(2, msg, strlen(msg));
-       rv |= write(2, "\n", 1);
+       rv = (write(2, msg, strlen(msg)) != (int)strlen(msg));
+       rv |= (write(2, "\n", 1) != 1);
        exit(rv ? 1 : 2);
 }
 
index 3a5f11500e23083aec694db604f760f6fe7999c5..6a26bf037b9408a9c7b636815bd23d271494f8be 100644 (file)
@@ -12,7 +12,13 @@ do
   do dd if=/dev/urandom of=$d bs=1024 || true
   done
 
-  mdadm -CR $md0 -amd -l5 -c 256 -n$disks --assume-clean $devs
+  case $disks in
+   2 | 3) chunk=1024;;
+   4 ) chunk=512;;
+   5 ) chunk=256;;
+  esac
+
+  mdadm -CR $md0 -amd -l5 -c $chunk -n$disks --assume-clean $devs
   mdadm $md0 --add $dev6
   echo 20 > /proc/sys/dev/raid/speed_limit_max
   mdadm --grow $md0 -n $[disks+1]