[dm-devel] RE: [Bug 217014] Setting "user_friendly_names" to "yes" causesdm-mp to occasionally miss a mpath device during configuration

Edward Goggin egoggin at emc.com
Mon Nov 27 22:32:44 UTC 2006


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.varoqui at free.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, bugzilla at redhat.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 egoggin at emc.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 == '\0') {
> >  		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 == '\0') {
> >  		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;
> >  }
> > 
> 
> 
> 




More information about the dm-devel mailing list