continue;
}
- if (super) {
- free(super);
- super = NULL;
- }
-
dfd = dev_open(devname, O_RDONLY|O_EXCL);
if (dfd < 0) {
if ((inargv && verbose >= 0) || verbose > 0)
fprintf( stderr, Name ": no RAID superblock on %s\n",
devname);
} else {
- tst->ss->getinfo_super(&info, super);
+ tst->ss->getinfo_super(tst, &info, super);
}
if (dfd >= 0) close(dfd);
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong uuid.\n",
devname);
- continue;
+ goto loop;
}
if (ident->name[0] && (!update || strcmp(update, "name")!= 0) &&
(!super || name_matches(info.name, ident->name, homehost)==0)) {
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong name.\n",
devname);
- continue;
+ goto loop;
}
if (ident->super_minor != UnSet &&
(!super || ident->super_minor != info.array.md_minor)) {
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong super-minor.\n",
devname);
- continue;
+ goto loop;
}
if (ident->level != UnSet &&
(!super|| ident->level != info.array.level)) {
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s has wrong raid level.\n",
devname);
- continue;
+ goto loop;
}
if (ident->raid_disks != UnSet &&
(!super || ident->raid_disks!= info.array.raid_disks)) {
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s requires wrong number of drives.\n",
devname);
- continue;
+ goto loop;
}
if (mdfd < 0) {
if (tst == NULL || super == NULL)
continue;
if (update == NULL &&
- tst->ss->match_home(super, homehost)==0) {
+ tst->ss->match_home(tst, super, homehost)==0) {
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s is not built for host %s.\n",
devname, homehost);
/* Auto-assemble, and this is not a usable host */
/* if update != NULL, we are updating the host
* name... */
- continue;
+ goto loop;
}
}
/* If we are this far, then we are nearly commited to this device.
if (!super) {
fprintf(stderr, Name ": %s has no superblock - assembly aborted\n",
devname);
- free(first_super);
+ st->ss->free_super(st, first_super);
return 1;
}
* for now.
*/
if (mdfd < 0)
- continue;
+ goto loop;
if (homehost) {
- int first = st->ss->match_home(first_super, homehost);
- int last = tst->ss->match_home(super, homehost);
+ int first = st->ss->match_home(st, first_super,
+ homehost);
+ int last = tst->ss->match_home(tst, super,
+ homehost);
if (first+last == 1) {
/* We can do something */
if (first) {/* just ignore this one */
if ((inargv && verbose >= 0) || verbose > 0)
fprintf(stderr, Name ": %s misses out due to wrong homehost\n",
devname);
- continue;
+ goto loop;
} else { /* reject all those sofar */
mddev_dev_t td;
if ((inargv && verbose >= 0) || verbose > 0)
if (td->used == 1)
td->used = 0;
tmpdev->used = 1;
- continue;
+ goto loop;
}
}
}
fprintf(stderr, Name ": superblock on %s doesn't match others - assembly aborted\n",
devname);
- free(super);
- free(first_super);
+ tst->ss->free_super(tst, super);
+ st->ss->free_super(st, first_super);
return 1;
}
tmpdev->used = 1;
+
+ loop:
+ if (super)
+ tst->ss->free_super(tst, super);
+ super = NULL;
}
if (mdfd < 0) {
if (!first_super) {
return 2;
}
- st->ss->getinfo_super(&info, first_super);
+ st->ss->getinfo_super(st, &info, first_super);
c = strchr(info.name, ':');
if (c) c++; else c= info.name;
if (isdigit(*c) && ((ident->autof & 7)==4 || (ident->autof&7)==6))
asprintf(&mddev, "/dev/md/%s", c);
mdfd = open_mddev(mddev, ident->autof);
if (mdfd < 0) {
- free(first_super);
+ st->ss->free_super(st, first_super);
free(devices);
first_super = NULL;
goto try_again;
mddev, tmpdev->devname);
close(mdfd);
mdfd = -1;
- free(first_super);
+ st->ss->free_super(st, first_super);
free(devices);
first_super = NULL;
goto try_again;
remove_partitions(dfd);
- if (super) {
- free(super);
- super = NULL;
- }
-
st->ss->load_super(st, dfd, &super, NULL);
- st->ss->getinfo_super(&info, super);
+ st->ss->getinfo_super(st, &info, super);
memcpy(info.uuid, ident->uuid, 16);
strcpy(info.name, ident->name);
info.array.md_minor = minor(stb2.st_rdev);
- st->ss->update_super(&info, super, update, devname, verbose,
+ st->ss->update_super(st, &info, super, update,
+ devname, verbose,
ident->uuid_set, homehost);
if (strcmp(update, "uuid")==0 &&
!ident->uuid_set) {
remove_partitions(dfd);
- if (super) {
- free(super);
- super = NULL;
- }
-
st->ss->load_super(st, dfd, &super, NULL);
- st->ss->getinfo_super(&info, super);
+ st->ss->getinfo_super(st, &info, super);
close(dfd);
}
best[i] = devcnt;
}
devcnt++;
- }
- if (super)
- free(super);
- super = NULL;
+ if (super)
+ st->ss->free_super(st, super);
+ super = NULL;
+ }
if (update && strcmp(update, "byteorder")==0)
st->minor_version = 90;
if (devcnt == 0) {
fprintf(stderr, Name ": no devices found for %s\n",
mddev);
- free(first_super);
+ st->ss->free_super(st, first_super);
if (must_close) close(mdfd);
return 1;
}
- st->ss->getinfo_super(&info, first_super);
+ st->ss->getinfo_super(st, &info, first_super);
clean = info.array.state & 1;
/* now we have some devices that might be suitable.
continue;
}
info.events = devices[most_recent].events;
- st->ss->update_super(&info, super, "force-one",
+ st->ss->update_super(st, &info, super, "force-one",
devices[chosen_drive].devname, verbose,
0, NULL);
fprintf(stderr, Name ": Could not re-write superblock on %s\n",
devices[chosen_drive].devname);
devices[chosen_drive].events = 0;
- free(super);
+ st->ss->free_super(st, super);
continue;
}
close(fd);
devices[chosen_drive].uptodate = 1;
avail[chosen_drive] = 1;
okcnt++;
- free(super);
+ st->ss->free_super(st, super);
/* If there are any other drives of the same vintage,
* add them in as well. We can't lose and we might gain
if (must_close) close(mdfd);
return 1;
}
- st->ss->getinfo_super(&info, super);
+ st->ss->getinfo_super(st, &info, super);
for (i=0; i<bestcnt; i++) {
int j = best[i];
unsigned int desired_state;
info.disk.state = desired_state;
if (devices[j].uptodate &&
- st->ss->update_super(&info, super, "assemble", NULL, verbose, 0, NULL)) {
+ st->ss->update_super(st, &info, super, "assemble", NULL,
+ verbose, 0, NULL)) {
if (force) {
if (verbose >= 0)
fprintf(stderr, Name ": "
!enough(info.array.level, info.array.raid_disks,
info.array.layout, clean,
avail, okcnt)) {
- change += st->ss->update_super(&info, super, "force-array",
+ change += st->ss->update_super(st, &info, super, "force-array",
devices[chosen_drive].devname, verbose,
0, NULL);
clean = 1;
fprintf(stderr, Name ": no uptodate device for slot %d of %s\n",
i, mddev);
}
-
+
if (runstop == 1 ||
(runstop <= 0 &&
( enough(info.array.level, info.array.raid_disks,
fprintf(stderr, Name ": Cannot start array: %s\n",
strerror(errno));
}
-
+
}
if (must_close) close(mdfd);
return 0;