From af99d9ca67a4dc898e7be1d4a947800deec93c83 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 31 Jul 2009 17:08:22 -0700 Subject: [PATCH] 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 --- 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 5ad89c25..517a5864 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 3abaca5a..24827d0b 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; -- 2.39.2