Re: [PATCH] imsm: fill working_disks according to metadata.

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

 



On 1/17/20 9:24 AM, Blazej Kucman wrote:
> Imsm tracts as "working_disk" each visible drive.
> Assemble routine expects that the value will return count
> of active member drives recorded in metadata.
> As a side effect "--no-degraded" doesn't work correctly for imsm.
> Align this field to others.
> Added check, if the option --no-degraded is called with --scan.

I assume you meant tracks rather than tracts? I corrected this in the
description and applied this. If I was wrong, my apologies.

Thanks,
Jes


> Signed-off-by: Blazej Kucman <blazej.kucman@xxxxxxxxx>
> ---
>  mdadm.c       | 9 ++++++---
>  super-intel.c | 5 ++---
>  2 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/mdadm.c b/mdadm.c
> index 256a97ef..13dc24e4 100644
> --- a/mdadm.c
> +++ b/mdadm.c
> @@ -1485,9 +1485,12 @@ int main(int argc, char *argv[])
>  			rv = Manage_stop(devlist->devname, mdfd, c.verbose, 0);
>  		break;
>  	case ASSEMBLE:
> -		if (devs_found == 1 && ident.uuid_set == 0 &&
> -		    ident.super_minor == UnSet && ident.name[0] == 0 &&
> -		    !c.scan ) {
> +		if (!c.scan && c.runstop == -1) {
> +			pr_err("--no-degraded not meaningful without a --scan assembly.\n");
> +			exit(1);
> +		} else if (devs_found == 1 && ident.uuid_set == 0 &&
> +			   ident.super_minor == UnSet && ident.name[0] == 0 &&
> +			   !c.scan) {
>  			/* Only a device has been given, so get details from config file */
>  			struct mddev_ident *array_ident = conf_get_ident(devlist->devname);
>  			if (array_ident == NULL) {
> diff --git a/super-intel.c b/super-intel.c
> index 5c1f759f..47809bc2 100644
> --- a/super-intel.c
> +++ b/super-intel.c
> @@ -7946,7 +7946,8 @@ static struct mdinfo *container_content_imsm(struct supertype *st, char *subarra
>  				skip = 1;
>  			if (!skip && (ord & IMSM_ORD_REBUILD))
>  				recovery_start = 0;
> -
> +			if (!(ord & IMSM_ORD_REBUILD))
> +				this->array.working_disks++;
>  			/*
>  			 * if we skip some disks the array will be assmebled degraded;
>  			 * reset resync start to avoid a dirty-degraded
> @@ -7988,8 +7989,6 @@ static struct mdinfo *container_content_imsm(struct supertype *st, char *subarra
>  				else
>  					this->array.spare_disks++;
>  			}
> -			if (info_d->recovery_start == MaxSector)
> -				this->array.working_disks++;
>  
>  			info_d->events = __le32_to_cpu(mpb->generation_num);
>  			info_d->data_offset = pba_of_lba0(map);
> 





[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