for (; devlist ; devlist=devlist->next) {
struct supertype *st;
+ int have_container = 0;
fd = dev_open(devlist->devname, O_RDONLY);
if (fd < 0) {
err = 1;
}
else {
+ unsigned long long size;
+ int container = 0;
if (forcest)
st = dup_super(forcest);
- else
+ else if (get_dev_size(fd, NULL, &size) == 0 || size == 0) {
+ /* might be a container */
+ st = super_by_fd(fd, NULL);
+ container = 1;
+ } else
st = guess_super(fd);
- if (st)
- err = st->ss->load_super(st, fd,
- (brief||scan) ? NULL
- :devlist->devname);
- else {
+ if (st) {
+ err = 1;
+ if (!container)
+ err = st->ss->load_super(st, fd,
+ (brief||scan) ? NULL
+ :devlist->devname);
+ if (err && st->ss->load_container) {
+ err = st->ss->load_container(st, fd,
+ (brief||scan) ? NULL
+ :devlist->devname);
+ if (!err)
+ have_container = 1;
+ }
+ } else {
if (!brief) {
fprintf(stderr, Name ": No md superblock detected on %s.\n", devlist->devname);
rv = 1;
st->ss->getinfo_super(st, &ap->info, NULL);
} else
st->ss->getinfo_super(st, &ap->info, NULL);
- if (!st->loaded_container &&
+ if (!have_container &&
!(ap->info.disk.state & (1<<MD_DISK_SYNC)))
ap->spares++;
d = dl_strdup(devlist->devname);