List Info

Thread: Setting "user_friendly_names" to "yes" causes dm-mp to occasionally miss a mpath device during confi




Setting "user_friendly_names" to "yes" causes dm-mp to occasionally miss a mpath device during confi
user name
2006-11-27 22:09:56
Nice fix, thank you.
Merged.

Le lundi 27 novembre 2006 à 11:30 -0500, bugzillaredhat.com a écrit :
> Please do not reply directly to this email. All
additional
> comments should be made in the comments box of this bug
report.
> 
> Summary: Setting "user_friendly_names" to
"yes" causes dm-mp to occasionally miss a mpath
device during configuration
> 
> 
> https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=
217014
> 
> 
> 
> 
> 
> ------- Additional Comments From egogginemc.com 
2006-11-27 11:29 EST -------
> The posix file byte range locks used to provide
atomicity for accessing the 
> entries in the multipath bindings file get released
from whenever __any__ 
> descriptor or FILE structure for that file is closed. 
This patch delays the 
> fclose() for the FILE structures used within
lookup_binding() and 
> rlookup_binding() until there is no more need for the
atomicity.
> 
> Without this patch I could fairly easily get two
multipath mpath0 entries 
> in /var/lib/multipath/bindings by running 8 concurrent
instances of multipath
> (8) while with the patch I cannot get this problem to
occur.
> 
> diff --git a/libmultipath/alias.c
b/libmultipath/alias.c
> index 6d103d7..86cae9b 100644
> --- a/libmultipath/alias.c
> +++ b/libmultipath/alias.c
>  -166,28 +166,14  fail:
>  
> 
>  static int
> -lookup_binding(int fd, char *map_wwid, char
**map_alias)
> +lookup_binding(FILE *f, char *map_wwid, char
**map_alias)
>  {
>  	char buf[LINE_MAX];
> -	FILE *f;
>  	unsigned int line_nr = 0;
> -	int scan_fd;
>  	int id = 0;
>  
>  	*map_alias = NULL;
> -	scan_fd = dup(fd);
> -	if (scan_fd < 0) {
> -		condlog(0, "Cannot dup bindings file descriptor
: %s",
> -			strerror(errno));
> -		return -1;
> -	}
> -	f = fdopen(scan_fd, "r");
> -	if (!f) {
> -		condlog(0, "cannot fdopen on bindings file
descriptor : %s",
> -			strerror(errno));
> -		close(scan_fd);
> -		return -1;
> -	}
> +
>  	while (fgets(buf, LINE_MAX, f)) {
>  		char *c, *alias, *wwid;
>  		int curr_id;
>  -215,38 +201,22  lookup_binding(int fd,
char *map_wwid, c
>  			if (*map_alias == NULL)
>  				condlog(0, "Cannot copy alias from bindings
"
>  					"file : %s", strerror(errno));
> -			fclose(f);
>  			return id;
>  		}
>  	}
>  	condlog(3, "No matching wwid [%s] in bindings
file.", map_wwid);
> -	fclose(f);
>  	return id;
>  }	
>  
>  static int
> -rlookup_binding(int fd, char **map_wwid, char
*map_alias)
> +rlookup_binding(FILE *f, char **map_wwid, char
*map_alias)
>  {
>  	char buf[LINE_MAX];
> -	FILE *f;
>  	unsigned int line_nr = 0;
> -	int scan_fd;
>  	int id = 0;
>  
>  	*map_wwid = NULL;
> -	scan_fd = dup(fd);
> -	if (scan_fd < 0) {
> -		condlog(0, "Cannot dup bindings file descriptor
: %s",
> -			strerror(errno));
> -		return -1;
> -	}
> -	f = fdopen(scan_fd, "r");
> -	if (!f) {
> -		condlog(0, "cannot fdopen on bindings file
descriptor : %s",
> -			strerror(errno));
> -		close(scan_fd);
> -		return -1;
> -	}
> +
>  	while (fgets(buf, LINE_MAX, f)) {
>  		char *c, *alias, *wwid;
>  		int curr_id;
>  -274,12 +244,10  rlookup_binding(int fd,
char **map_wwid,
>  			if (*map_wwid == NULL)
>  				condlog(0, "Cannot copy alias from bindings
"
>  					"file : %s", strerror(errno));
> -			fclose(f);
>  			return id;
>  		}
>  	}
>  	condlog(3, "No matching alias [%s] in bindings
file.", map_alias);
> -	fclose(f);
>  	return id;
>  }	
>  
>  -327,7 +295,8  char *
>  get_user_friendly_alias(char *wwid, char *file)
>  {
>  	char *alias;
> -	int fd, id;
> +	int fd, scan_fd, id;
> +	FILE *f;
>  
>  	if (!wwid || *wwid == '') {
>  		condlog(3, "Cannot find binding for empty
WWID");
>  -337,14 +306,37 
get_user_friendly_alias(char *wwid, char
>  	fd = open_bindings_file(file);
>  	if (fd < 0)
>  		return NULL;
> -	id = lookup_binding(fd, wwid, &alias);
> +
> +	scan_fd = dup(fd);
> +	if (scan_fd < 0) {
> +		condlog(0, "Cannot dup bindings file descriptor
: %s",
> +			strerror(errno));
> +		close(fd);
> +		return NULL;
> +	}
> +
> +	f = fdopen(scan_fd, "r");
> +	if (!f) {
> +		condlog(0, "cannot fdopen on bindings file
descriptor : %s",
> +			strerror(errno));
> +		close(scan_fd);
> +		close(fd);
> +		return NULL;
> +	}
> +
> +	id = lookup_binding(f, wwid, &alias);
>  	if (id < 0) {
> +		fclose(f);
> +		close(scan_fd);
>  		close(fd);
>  		return NULL;
>  	}
> +
>  	if (!alias)
>  		alias = allocate_binding(fd, wwid, id);
>  
> +	fclose(f);
> +	close(scan_fd);
>  	close(fd);
>  	return alias;
>  }
>  -353,7 +345,8  char *
>  get_user_friendly_wwid(char *alias, char *file)
>  {
>  	char *wwid;
> -	int fd, id;
> +	int fd, scan_fd, id;
> +	FILE *f;
>  
>  	if (!alias || *alias == '') {
>  		condlog(3, "Cannot find binding for empty
alias");
>  -363,12 +356,34 
get_user_friendly_wwid(char *alias, char
>  	fd = open_bindings_file(file);
>  	if (fd < 0)
>  		return NULL;
> -	id = rlookup_binding(fd, &wwid, alias);
> +
> +	scan_fd = dup(fd);
> +	if (scan_fd < 0) {
> +		condlog(0, "Cannot dup bindings file descriptor
: %s",
> +			strerror(errno));
> +		close(fd);
> +		return NULL;
> +	}
> +
> +	f = fdopen(scan_fd, "r");
> +	if (!f) {
> +		condlog(0, "cannot fdopen on bindings file
descriptor : %s",
> +			strerror(errno));
> +		close(scan_fd);
> +		close(fd);
> +		return NULL;
> +	}
> +
> +	id = rlookup_binding(f, &wwid, alias);
>  	if (id < 0) {
> +		fclose(f);
> +		close(scan_fd);
>  		close(fd);
>  		return NULL;
>  	}
>  
> +	fclose(f);
> +	close(scan_fd);
>  	close(fd);
>  	return wwid;
>  }
> 

--
dm-devel mailing list
dm-develredhat.com
http
s://www.redhat.com/mailman/listinfo/dm-devel
Setting "user_friendly_names" to "yes" causesdm-mp to occasionally miss a mpath device during config
user name
2006-11-27 22:32:44
Sorry, but I didn't send it to you directly since I
mistakenly
thought you had already merged in the fix after I had
initially sent out this patch to the dm-devel list on 7/17. 

> -----Original Message-----
> From: Christophe Varoqui [mailto:christophe.varoquifree.fr] 
> Sent: Monday, November 27, 2006 5:10 PM
> To: goggin, edward
> Cc: device-mapper development
> Subject: Re: [Bug 217014] Setting
"user_friendly_names" to 
> "yes" causesdm-mp to occasionally miss a
mpath device during 
> configuration
> 
> Nice fix, thank you.
> Merged.
> 
> Le lundi 27 novembre 2006 à 11:30 -0500, bugzillaredhat.com a écrit :
> > Please do not reply directly to this email. All
additional
> > comments should be made in the comments box of
this bug report.
> > 
> > Summary: Setting "user_friendly_names"
to "yes" causes 
> dm-mp to occasionally miss a mpath device during
configuration
> > 
> > 
> > https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=
217014
> > 
> > 
> > 
> > 
> > 
> > ------- Additional Comments From egogginemc.com  
> 2006-11-27 11:29 EST -------
> > The posix file byte range locks used to provide
atomicity 
> for accessing the 
> > entries in the multipath bindings file get
released from 
> whenever __any__ 
> > descriptor or FILE structure for that file is
closed.  This 
> patch delays the 
> > fclose() for the FILE structures used within
lookup_binding() and 
> > rlookup_binding() until there is no more need for
the atomicity.
> > 
> > Without this patch I could fairly easily get two
multipath 
> mpath0 entries 
> > in /var/lib/multipath/bindings by running 8
concurrent 
> instances of multipath
> > (8) while with the patch I cannot get this problem
to occur.
> > 
> > diff --git a/libmultipath/alias.c
b/libmultipath/alias.c
> > index 6d103d7..86cae9b 100644
> > --- a/libmultipath/alias.c
> > +++ b/libmultipath/alias.c
> >  -166,28 +166,14  fail:
> >  
> > 
> >  static int
> > -lookup_binding(int fd, char *map_wwid, char
**map_alias)
> > +lookup_binding(FILE *f, char *map_wwid, char
**map_alias)
> >  {
> >  	char buf[LINE_MAX];
> > -	FILE *f;
> >  	unsigned int line_nr = 0;
> > -	int scan_fd;
> >  	int id = 0;
> >  
> >  	*map_alias = NULL;
> > -	scan_fd = dup(fd);
> > -	if (scan_fd < 0) {
> > -		condlog(0, "Cannot dup bindings file
descriptor : %s",
> > -			strerror(errno));
> > -		return -1;
> > -	}
> > -	f = fdopen(scan_fd, "r");
> > -	if (!f) {
> > -		condlog(0, "cannot fdopen on bindings file

> descriptor : %s",
> > -			strerror(errno));
> > -		close(scan_fd);
> > -		return -1;
> > -	}
> > +
> >  	while (fgets(buf, LINE_MAX, f)) {
> >  		char *c, *alias, *wwid;
> >  		int curr_id;
> >  -215,38 +201,22  lookup_binding(int fd,
char *map_wwid, c
> >  			if (*map_alias == NULL)
> >  				condlog(0, "Cannot copy alias 
> from bindings "
> >  					"file : %s", strerror(errno));
> > -			fclose(f);
> >  			return id;
> >  		}
> >  	}
> >  	condlog(3, "No matching wwid [%s] in
bindings file.", map_wwid);
> > -	fclose(f);
> >  	return id;
> >  }	
> >  
> >  static int
> > -rlookup_binding(int fd, char **map_wwid, char
*map_alias)
> > +rlookup_binding(FILE *f, char **map_wwid, char
*map_alias)
> >  {
> >  	char buf[LINE_MAX];
> > -	FILE *f;
> >  	unsigned int line_nr = 0;
> > -	int scan_fd;
> >  	int id = 0;
> >  
> >  	*map_wwid = NULL;
> > -	scan_fd = dup(fd);
> > -	if (scan_fd < 0) {
> > -		condlog(0, "Cannot dup bindings file
descriptor : %s",
> > -			strerror(errno));
> > -		return -1;
> > -	}
> > -	f = fdopen(scan_fd, "r");
> > -	if (!f) {
> > -		condlog(0, "cannot fdopen on bindings file

> descriptor : %s",
> > -			strerror(errno));
> > -		close(scan_fd);
> > -		return -1;
> > -	}
> > +
> >  	while (fgets(buf, LINE_MAX, f)) {
> >  		char *c, *alias, *wwid;
> >  		int curr_id;
> >  -274,12 +244,10  rlookup_binding(int fd,
char **map_wwid,
> >  			if (*map_wwid == NULL)
> >  				condlog(0, "Cannot copy alias 
> from bindings "
> >  					"file : %s", strerror(errno));
> > -			fclose(f);
> >  			return id;
> >  		}
> >  	}
> >  	condlog(3, "No matching alias [%s] in
bindings file.", 
> map_alias);
> > -	fclose(f);
> >  	return id;
> >  }	
> >  
> >  -327,7 +295,8  char *
> >  get_user_friendly_alias(char *wwid, char *file)
> >  {
> >  	char *alias;
> > -	int fd, id;
> > +	int fd, scan_fd, id;
> > +	FILE *f;
> >  
> >  	if (!wwid || *wwid == '') {
> >  		condlog(3, "Cannot find binding for empty
WWID");
> >  -337,14 +306,37 
get_user_friendly_alias(char *wwid, char
> >  	fd = open_bindings_file(file);
> >  	if (fd < 0)
> >  		return NULL;
> > -	id = lookup_binding(fd, wwid, &alias);
> > +
> > +	scan_fd = dup(fd);
> > +	if (scan_fd < 0) {
> > +		condlog(0, "Cannot dup bindings file
descriptor : %s",
> > +			strerror(errno));
> > +		close(fd);
> > +		return NULL;
> > +	}
> > +
> > +	f = fdopen(scan_fd, "r");
> > +	if (!f) {
> > +		condlog(0, "cannot fdopen on bindings file

> descriptor : %s",
> > +			strerror(errno));
> > +		close(scan_fd);
> > +		close(fd);
> > +		return NULL;
> > +	}
> > +
> > +	id = lookup_binding(f, wwid, &alias);
> >  	if (id < 0) {
> > +		fclose(f);
> > +		close(scan_fd);
> >  		close(fd);
> >  		return NULL;
> >  	}
> > +
> >  	if (!alias)
> >  		alias = allocate_binding(fd, wwid, id);
> >  
> > +	fclose(f);
> > +	close(scan_fd);
> >  	close(fd);
> >  	return alias;
> >  }
> >  -353,7 +345,8  char *
> >  get_user_friendly_wwid(char *alias, char *file)
> >  {
> >  	char *wwid;
> > -	int fd, id;
> > +	int fd, scan_fd, id;
> > +	FILE *f;
> >  
> >  	if (!alias || *alias == '') {
> >  		condlog(3, "Cannot find binding for empty
alias");
> >  -363,12 +356,34 
get_user_friendly_wwid(char *alias, char
> >  	fd = open_bindings_file(file);
> >  	if (fd < 0)
> >  		return NULL;
> > -	id = rlookup_binding(fd, &wwid, alias);
> > +
> > +	scan_fd = dup(fd);
> > +	if (scan_fd < 0) {
> > +		condlog(0, "Cannot dup bindings file
descriptor : %s",
> > +			strerror(errno));
> > +		close(fd);
> > +		return NULL;
> > +	}
> > +
> > +	f = fdopen(scan_fd, "r");
> > +	if (!f) {
> > +		condlog(0, "cannot fdopen on bindings file

> descriptor : %s",
> > +			strerror(errno));
> > +		close(scan_fd);
> > +		close(fd);
> > +		return NULL;
> > +	}
> > +
> > +	id = rlookup_binding(f, &wwid, alias);
> >  	if (id < 0) {
> > +		fclose(f);
> > +		close(scan_fd);
> >  		close(fd);
> >  		return NULL;
> >  	}
> >  
> > +	fclose(f);
> > +	close(scan_fd);
> >  	close(fd);
> >  	return wwid;
> >  }
> > 
> 
> 
> 

--
dm-devel mailing list
dm-develredhat.com
http
s://www.redhat.com/mailman/listinfo/dm-devel
[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )