NeilBrown: Fix writing of second backup superblock during grow

Martin F. Krafft madduck at alioth.debian.org
Sat Aug 28 18:47:15 UTC 2010


Module: mdadm
Branch: master
Commit: 72044953776dc694d2bdd721ed9e8be4ac7e4e39
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=72044953776dc694d2bdd721ed9e8be4ac7e4e39

Author: NeilBrown <neilb at suse.de>
Date:   Thu Aug  5 21:39:17 2010 +1000

Fix writing of second backup superblock during grow

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 at suse.de>

---

 Grow.c               |   22 ++++++++++++++--------
 tests/07reshape5intr |    8 +++++++-
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/Grow.c b/Grow.c
index 78c3d4f..37674b8 100644
--- 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);
 }
 
diff --git a/tests/07reshape5intr b/tests/07reshape5intr
index 3a5f115..6a26bf0 100644
--- a/tests/07reshape5intr
+++ b/tests/07reshape5intr
@@ -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]




More information about the pkg-mdadm-commits mailing list