[dm-devel] Re: [Bug 217014] Setting "user_friendly_names" to "yes" causes dm-mp to occasionally miss a mpath device during configuration
Christophe Varoqui
christophe.varoqui at free.fr
Mon Nov 27 22:09:56 UTC 2006
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