diff options
author | NeilBrown <neilb@suse.de> | 2014-02-25 04:54:34 +0100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2014-02-25 04:54:34 +0100 |
commit | df842e69a3cb7316a06ba45f8f04d7b9beb0170f (patch) | |
tree | 4b605148ba87095e7e969e433634e9399c0d42af /Assemble.c | |
parent | New test: 03r5assem-failed (diff) | |
download | mdadm-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.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -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) |