summaryrefslogtreecommitdiffstats
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-02-25 04:54:34 +0100
committerNeilBrown <neilb@suse.de>2014-02-25 04:54:34 +0100
commitdf842e69a3cb7316a06ba45f8f04d7b9beb0170f (patch)
tree4b605148ba87095e7e969e433634e9399c0d42af /Assemble.c
parentNew test: 03r5assem-failed (diff)
downloadmdadm-df842e69a3cb7316a06ba45f8f04d7b9beb0170f.tar.xz
mdadm-df842e69a3cb7316a06ba45f8f04d7b9beb0170f.zip
Assemble: allow load_devices to change the 'st' which is passed in.
The given 'st' might not be best. Making this interface change will allow load_devices to return a better 'st'. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/Assemble.c b/Assemble.c
index fdb38e4e..af02633c 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -551,7 +551,7 @@ struct devs {
};
static int load_devices(struct devs *devices, char *devmap,
- struct mddev_ident *ident, struct supertype *st,
+ struct mddev_ident *ident, struct supertype **stp,
struct mddev_dev *devlist, struct context *c,
struct mdinfo *content,
int mdfd, char *mddev,
@@ -567,6 +567,7 @@ static int load_devices(struct devs *devices, char *devmap,
int most_recent = -1;
int bestcnt = 0;
int *best = *bestp;
+ struct supertype *st = *stp;
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) {
char *devname = tmpdev->devname;
@@ -610,6 +611,7 @@ static int load_devices(struct devs *devices, char *devmap,
close(mdfd);
free(devices);
free(devmap);
+ *stp = st;
return -1;
}
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
@@ -636,6 +638,7 @@ static int load_devices(struct devs *devices, char *devmap,
close(dfd);
free(devices);
free(devmap);
+ *stp = st;
return -1;
}
if (strcmp(c->update, "uuid")==0 &&
@@ -675,6 +678,7 @@ static int load_devices(struct devs *devices, char *devmap,
close(mdfd);
free(devices);
free(devmap);
+ *stp = st;
return -1;
}
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
@@ -759,6 +763,7 @@ static int load_devices(struct devs *devices, char *devmap,
close(mdfd);
free(devices);
free(devmap);
+ *stp = st;
return -1;
}
if (best[i] == -1
@@ -772,6 +777,7 @@ static int load_devices(struct devs *devices, char *devmap,
*most_recentp = most_recent;
*bestcntp = bestcnt;
*bestp = best;
+ *stp = st;
return devcnt;
}
@@ -1432,7 +1438,7 @@ try_again:
/* Ok, no bad inconsistancy, we can try updating etc */
devices = xcalloc(num_devs, sizeof(*devices));
devmap = xcalloc(num_devs, content->array.raid_disks);
- devcnt = load_devices(devices, devmap, ident, st, devlist,
+ devcnt = load_devices(devices, devmap, ident, &st, devlist,
c, content, mdfd, mddev,
&most_recent, &bestcnt, &best, inargv);
if (devcnt < 0)