Re: [PATCH] fix: Allowed to assemble 2 volumes with the same names from config file.

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

 



On Fri, 04 Nov 2011 09:51:48 +0100 Lukasz Orlowski
<lukasz.orlowski@xxxxxxxxx> wrote:

> mdadm allowes to assemble 2 volumes with the same names based on the
> config file. The issue is fixed by iterating over the list of md device
> identifiers and comparing the names of md devices against each other,
> detecting identical names and blocking the assembly should the same names
> be found.
> Now having detected duplicate names, mdadm terminates without assembling
> the container, displaying appropriate prompt.
> 
> Signed-off-by: Lukasz Orlowski <lukasz.orlowski@xxxxxxxxx>
> ---
>  config.c |   25 +++++++++++++++++++++++++
>  mdadm.c  |    7 +++++++
>  mdadm.h  |    1 +
>  3 files changed, 33 insertions(+), 0 deletions(-)
> 
> diff --git a/config.c b/config.c
> index c0a6baa..9b337eb 100644
> --- a/config.c
> +++ b/config.c
> @@ -1088,3 +1088,28 @@ struct mddev_ident *conf_match(struct mdinfo *info, struct supertype *st)
>  	}
>  	return match;
>  }
> +
> +int conf_verify_devnames(struct mddev_ident *array_list)
> +{
> +	struct mddev_ident *a1, *a2;
> +
> +	for (a1 = array_list; a1; a1 = a1->next) {
> +		if (!a1->devname)
> +			continue;
> +		for (a2 = a1->next; a2; a2 = a2->next) {
> +			if (!a2->devname)
> +				continue;
> +			if (!strcmp(a1->devname, a2->devname)) {
> +				fprintf(stderr,
> +					Name ": Devices %x:%x:%x:%x and "
> +					"%x:%x:%x:%x have the same name: %s\n",
> +					a1->uuid[0], a1->uuid[1], a1->uuid[2],
> +					a1->uuid[3], a2->uuid[0], a2->uuid[1],
> +					a2->uuid[2], a2->uuid[3], a1->devname);
> +				return 1;
> +			}
> +		}
> +	}
> +
> +	return 0;
> +}
> diff --git a/mdadm.c b/mdadm.c
> index 56de7b7..ebf4c4d 100644
> --- a/mdadm.c
> +++ b/mdadm.c
> @@ -1282,6 +1282,13 @@ int main(int argc, char *argv[])
>  			struct map_ent *map = NULL;
>  			int cnt = 0;
>  			int failures, successes;
> +
> +			if (conf_verify_devnames(array_list)) {
> +				fprintf(stderr, Name
> +					": Duplicate MD device names in "
> +					"conf file were found.\n");
> +				exit(1);
> +			}
>  			if (devlist == NULL) {
>  				fprintf(stderr, Name ": No devices listed in conf file were found.\n");
>  				exit(1);
> diff --git a/mdadm.h b/mdadm.h
> index 6dbc5ea..bff454f 100644
> --- a/mdadm.h
> +++ b/mdadm.h
> @@ -1145,6 +1145,7 @@ extern char *conf_get_homehost(int *require_homehostp);
>  extern char *conf_line(FILE *file);
>  extern char *conf_word(FILE *file, int allow_key);
>  extern int conf_name_is_free(char *name);
> +extern int conf_verify_devnames(struct mddev_ident *array_list);
>  extern int devname_matches(char *name, char *match);
>  extern struct mddev_ident *conf_match(struct mdinfo *info, struct supertype *st);
>  extern int experimental(void);
> 

Thanks.
I've applied this patch, though with a few changes.

1/ I personally despise the "!strcmp()" usage.  It seems to be saying "not"
   but it is actually saying "is equal".  I always write
       strcmp(a,c) == 0
   or != or < or whatever comparison is wanted.
2/ You assume that both names have a uuid but that may not be correct.  You
   need to check 'uuid_set'.

Thanks,
NeilBrown

Attachment: signature.asc
Description: PGP signature


[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