};
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,
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;
struct stat stb;
+ struct supertype *tst;
int i;
if (tmpdev->used != 1)
int dfd;
/* prepare useful information in info structures */
struct stat stb2;
- struct supertype *tst;
int err;
fstat(mdfd, &stb2);
close(mdfd);
free(devices);
free(devmap);
+ tst->ss->free_super(tst);
+ free(tst);
+ *stp = st;
return -1;
}
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
close(dfd);
free(devices);
free(devmap);
+ *stp = st;
return -1;
}
if (strcmp(c->update, "uuid")==0 &&
else
bitmap_done = 1;
}
- tst->ss->free_super(tst);
} else
#endif
{
- struct supertype *tst = dup_super(st);
- int dfd;
- dfd = dev_open(devname,
- tmpdev->disposition == 'I'
- ? O_RDWR : (O_RDWR|O_EXCL));
+ int dfd = dev_open(devname,
+ tmpdev->disposition == 'I'
+ ? O_RDWR : (O_RDWR|O_EXCL));
+ tst = dup_super(st);
if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
pr_err("cannot re-read metadata from %s - aborting\n",
close(mdfd);
free(devices);
free(devmap);
+ tst->ss->free_super(tst);
+ free(tst);
+ *stp = st;
return -1;
}
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
- tst->ss->free_super(tst);
close(dfd);
}
if (devices[devcnt].i.disk.state == 6) {
if (most_recent < 0 ||
devices[devcnt].i.events
- > devices[most_recent].i.events)
+ > devices[most_recent].i.events) {
+ struct supertype *tmp = tst;
+ tst = st;
+ st = tmp;
most_recent = devcnt;
+ }
}
+ tst->ss->free_super(tst);
+ free(tst);
if (content->array.level == LEVEL_MULTIPATH)
/* with multipath, the raid_disk from the superblock is meaningless */
close(mdfd);
free(devices);
free(devmap);
+ *stp = st;
return -1;
}
if (best[i] == -1
*most_recentp = most_recent;
*bestcntp = bestcnt;
*bestp = best;
+ *stp = st;
return devcnt;
}
"array_state", "readonly");
if (rv == 0)
rv = Grow_continue(mdfd, st, content,
- c->backup_file,
+ c->backup_file, 0,
c->freeze_reshape);
} else if (c->readonly &&
sysfs_attribute_available(
/* 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)
pr_err(":%s has an active reshape - checking "
"if critical section needs to be restored\n",
chosen_name);
+ if (!c->backup_file)
+ c->backup_file = locate_backup(content->sys_name);
enable_fds(bestcnt/2);
for (i = 0; i < bestcnt/2; i++) {
int j = best[i*2];
int spare = content->array.raid_disks + expansion;
if (restore_backup(st, content,
working,
- spare, c->backup_file, c->verbose) == 1)
+ spare, &c->backup_file, c->verbose) == 1)
return 1;
err = sysfs_set_str(content, NULL,
}
err = Grow_continue(mdfd, st, content, c->backup_file,
- c->freeze_reshape);
+ 0, c->freeze_reshape);
} else switch(content->array.level) {
case LEVEL_LINEAR:
case LEVEL_MULTIPATH: