NeilBrown: Grow: Fix linear-growth when devices are not all the same size.

Martin F. Krafft madduck at alioth.debian.org
Mon Feb 16 11:24:08 UTC 2009


Module: mdadm
Branch: build
Commit: 1c6cb603fa60d3425f4d4b76e721b485bb006fcb
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=1c6cb603fa60d3425f4d4b76e721b485bb006fcb

Author: NeilBrown <neilb at suse.de>
Date:   Wed Oct 15 14:34:18 2008 +1100

Grow: Fix linear-growth when devices are not all the same size.

If we add a device to a linear array which is a difference size
to the other devices in the array then, for v1.x metadata, we need to
make sure the size is correctly reflected in the superblock.

---

 super1.c |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/super1.c b/super1.c
index bec0c5e..62a3ab9 100644
--- a/super1.c
+++ b/super1.c
@@ -599,7 +599,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 	}
 	if (strcmp(update, "linear-grow-new") == 0) {
 		int i;
-		int rfd;
+		int rfd, fd;
 		int max = __le32_to_cpu(sb->max_dev);
 
 		for (i=0 ; i < max ; i++)
@@ -620,6 +620,25 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 
 		sb->dev_roles[i] =
 			__cpu_to_le16(info->disk.raid_disk);
+
+		fd = open(devname, O_RDONLY);
+		if (fd >= 0) {
+			unsigned long long ds;
+			get_dev_size(fd, devname, &ds);
+			close(fd);
+			ds >>= 9;
+			if (__le64_to_cpu(sb->super_offset) <
+			    __le64_to_cpu(sb->data_offset)) {
+				sb->data_size = __cpu_to_le64(
+					ds - __le64_to_cpu(sb->data_offset));
+			} else {
+				ds -= 8*2;
+				ds &= ~(unsigned long long)(4*2-1);
+				sb->super_offset = __cpu_to_le64(ds);
+				sb->data_size = __cpu_to_le64(
+					ds - __le64_to_cpu(sb->data_offset));
+			}
+		}
 	}
 	if (strcmp(update, "linear-grow-update") == 0) {
 		sb->raid_disks = __cpu_to_le32(info->array.raid_disks);




More information about the pkg-mdadm-commits mailing list