> > As mentioned earlier, I added a test for 'auto_assem'. > > Adding such test means that we can only assemble spares on their own > when there is no config file. > When there is a config file with at least one ARRAY line we do not try > auto assembly. > This also means that adding special ARRAY line for spares will not work > - in this case > we have no auto_assem (because uuid is set) so we try the second loop > where all spares get rejected because domains is null. ...and st->sb is not loaded. > Should `mdadm -As` only assemble what it finds in config? > Maybe we should always try auto assembly? > What is the original reasoning behind not trying auto assembly when > there is at least one array in config? > Regards > Anna > Spares not matching any array will not be picked up by auto assembly when there is config file. Should we just remove the check cnt == 0 in mdadm.c line 1290? Regards Anna > > Thanks, > > NeilBrown > > > > commit ed7fc6b4d91a5342886ba6fe6d175f69f0875d3b > > Author: Anna Czarnowska <anna.czarnowska@xxxxxxxxx> > > Date: Wed Jan 5 13:54:18 2011 +1100 > > > > Assemble: allow to assemble spares on their own > > > > If we find spares but no members of given array > > we create container with just spares. > > > > This allows auto assemble to pick up all lose imsm spares when > > there > > is no config file. > > When there is a valid config file and any array is assembled from > > it > > we don't try auto assembly so we will not assemble spares that > > don't > > match any array. > > To remedy this we must add > > ARRAY metadata=imsm UUID=00000000:00000000:00000000:00000000 > > to config file. > > This container will include all remaining spares. > > > > Signed-off-by: Anna Czarnowska <anna.czarnowska@xxxxxxxxx> > > Signed-off-by: NeilBrown <neilb@xxxxxxx> > > > > diff --git a/Assemble.c b/Assemble.c > > index 7ef9dc3..532335e 100644 > > --- a/Assemble.c > > +++ b/Assemble.c > > @@ -489,17 +489,23 @@ int Assemble(struct supertype *st, char *mddev, > > homehost, update, > > report_missmatch ? devname : NULL)) > > goto loop; > > - > > - if (!memcmp(content->uuid, uuid_zero, > > sizeof(int[4]))) { > > - /* this is imsm_spare - do not set st */ > > - tmpdev->used = 3; > > - goto loop; > > - } > > > > if (st == NULL) > > st = dup_super(tst); > > if (st->minor_version == -1) > > st->minor_version = tst->minor_version; > > + > > + if (memcmp(content->uuid, uuid_zero, > > + sizeof(int[4])) == 0) { > > + /* this is a floating spare. It cannot define > > + * an array unless there are no more arrays of > > + * this type to be found. It can be included > > + * in an array of this type though. > > + */ > > + tmpdev->used = 3; > > + goto loop; > > + } > > + > > if (st->ss != tst->ss || > > st->minor_version != tst->minor_version || > > st->ss->compare_super(st, tst) != 0) { > > @@ -557,6 +563,25 @@ int Assemble(struct supertype *st, char *mddev, > > tst->ss->free_super(tst); > > } > > > > + /* Check if we found some imsm spares but no members */ > > + if (auto_assem && (!st || !st->sb)) > > + for (tmpdev = devlist; tmpdev; tmpdev = tmpdev->next) { > > + if (tmpdev->used != 3) > > + continue; > > + tmpdev->used = 1; > > + content = &info; > > + > > + if (!st->sb) { > > + /* we need sb from one of the spares */ > > + int dfd = dev_open(tmpdev->devname, O_RDONLY); > > + if (dfd < 0 || > > + st->ss->load_super(st, dfd, NULL)) > > + tmpdev->used = 2; > > + if (dfd > 0) > > + close(dfd); > > + } > > + } > > + > > /* Now reject spares that don't match domains of identified > > members */ > > for (tmpdev = devlist; tmpdev; tmpdev = tmpdev->next) { > > struct stat stb; > > @@ -892,8 +917,10 @@ int Assemble(struct supertype *st, char *mddev, > > if (content->array.level != LEVEL_MULTIPATH) > > if (!(devices[j].i.disk.state & (1<<MD_DISK_ACTIVE))) > > { > > if (!(devices[j].i.disk.state > > - & (1<<MD_DISK_FAULTY))) > > + & (1<<MD_DISK_FAULTY))) { > > + devices[j].uptodate = 1; > > sparecnt++; > > + } > > continue; > > } > > /* If this devices thinks that 'most_recent' has failed, > > then > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-raid" > > in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- > To unsubscribe from this list: send the line "unsubscribe linux-raid" > in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html