Dan Williams: teach imsm and ddf what st->subarray means at load_super time

Martin F. Krafft madduck at alioth.debian.org
Tue Oct 27 19:21:23 UTC 2009


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

Author: Dan Williams <dan.j.williams at intel.com>
Date:   Fri Jul 31 17:08:22 2009 -0700

teach imsm and ddf what st->subarray means at load_super time

RebuildMap wants to poll through mdstat and retrieve a (kernel name,
uuid, user name) tuple for each array.  Teach imsm and ddf to honor
st->sub_array at ->load_super() time to set their internal subarray
pointers to the value specified in st->subarray, or return an error if
st->subarray specifies an invalid array.

Signed-off-by: Dan Williams <dan.j.williams at intel.com>




---

 super-ddf.c   |   12 ++++++++++++
 super-intel.c |   15 ++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/super-ddf.c b/super-ddf.c
index 5ad89c2..517a586 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -835,6 +835,18 @@ static int load_super_ddf(struct supertype *st, int fd,
 		return rv;
 	}
 
+	if (st->subarray[0]) {
+		struct vcl *v;
+
+		for (v = super->conflist; v; v = v->next)
+			if (v->vcnum == atoi(st->subarray))
+				super->currentconf = v;
+		if (!super->currentconf) {
+			free(super);
+			return 1;
+		}
+	}
+
 	/* Should possibly check the sections .... */
 
 	st->sb = super;
diff --git a/super-intel.c b/super-intel.c
index 3abaca5..24827d0 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -2167,8 +2167,10 @@ static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
 	if (st->subarray[0]) {
 		if (atoi(st->subarray) <= super->anchor->num_raid_devs)
 			super->current_vol = atoi(st->subarray);
-		else
+		else {
+			free_imsm(super);
 			return 1;
+		}
 	}
 
 	*sbp = super;
@@ -2193,8 +2195,6 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
 	if (load_super_imsm_all(st, fd, &st->sb, devname, 1) == 0)
 		return 0;
 #endif
-	if (st->subarray[0])
-		return 1; /* FIXME */
 
 	super = alloc_super(0);
 	if (!super) {
@@ -2215,6 +2215,15 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
 		return rv;
 	}
 
+	if (st->subarray[0]) {
+		if (atoi(st->subarray) <= super->anchor->num_raid_devs)
+			super->current_vol = atoi(st->subarray);
+		else {
+			free_imsm(super);
+			return 1;
+		}
+	}
+
 	st->sb = super;
 	if (st->ss == NULL) {
 		st->ss = &super_imsm;




More information about the pkg-mdadm-commits mailing list