RE: [PATCH 2/2] Assemble: allow to assemble spares on their own

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > 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


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux