Instead of always calling uid_fallback() if the configured method to get the uid failed, get_uid now checks if the path supports fallbacks and if all the retriggers have occurred. If so, it calls uid_fallback(), which just attempts to get the uid using the appropriate fallback method. None of these changes should make the code function any differently. Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> --- libmultipath/discovery.c | 85 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index bece67c..3ec60d6 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1755,50 +1755,50 @@ get_vpd_uid(struct path * pp) } static ssize_t uid_fallback(struct path *pp, int path_state, - const char **origin, ssize_t old_len) + const char **origin) { - ssize_t len = old_len; - int retrigger; - struct config *conf; - - conf = get_multipath_config(); - retrigger = conf->retrigger_tries; - put_multipath_config(conf); - if (pp->retriggers >= retrigger) { - if (pp->bus == SYSFS_BUS_SCSI && - !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { - len = get_vpd_uid(pp); - *origin = "sysfs"; - pp->uid_attribute = NULL; - if (len < 0 && path_state == PATH_UP) { - condlog(1, "%s: failed to get sysfs uid: %s", - pp->dev, strerror(-len)); - len = get_vpd_sgio(pp->fd, 0x83, pp->wwid, + ssize_t len = -1; + + if (pp->bus == SYSFS_BUS_SCSI && + !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { + len = get_vpd_uid(pp); + *origin = "sysfs"; + pp->uid_attribute = NULL; + if (len < 0 && path_state == PATH_UP) { + condlog(1, "%s: failed to get sysfs uid: %s", + pp->dev, strerror(-len)); + len = get_vpd_sgio(pp->fd, 0x83, pp->wwid, + WWID_SIZE); + *origin = "sgio"; + } + } else if (pp->bus == SYSFS_BUS_NVME) { + char value[256]; + len = sysfs_attr_get_value(pp->udev, "wwid", value, + sizeof(value)); + if (len <= 0) + return -1; + len = strlcpy(pp->wwid, value, WWID_SIZE); + if (len >= WWID_SIZE) { + len = fix_broken_nvme_wwid(pp, value, WWID_SIZE); - *origin = "sgio"; - } - } else if (pp->bus == SYSFS_BUS_NVME) { - char value[256]; - len = sysfs_attr_get_value(pp->udev, "wwid", value, - sizeof(value)); - if (len <= 0) - return -1; - len = strlcpy(pp->wwid, value, WWID_SIZE); - if (len >= WWID_SIZE) { - len = fix_broken_nvme_wwid(pp, value, - WWID_SIZE); - if (len > 0) - return len; - condlog(0, "%s: wwid overflow", pp->dev); - len = WWID_SIZE; - } - *origin = "sysfs"; - pp->uid_attribute = NULL; + if (len > 0) + return len; + condlog(0, "%s: wwid overflow", pp->dev); + len = WWID_SIZE; } + *origin = "sysfs"; + pp->uid_attribute = NULL; } return len; } +static int has_uid_fallback(struct path *pp) +{ + return ((pp->bus == SYSFS_BUS_SCSI && + !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) || + pp->bus == SYSFS_BUS_NVME); +} + int get_uid (struct path * pp, int path_state, struct udev_device *udev) { @@ -1846,8 +1846,15 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev) len = get_vpd_uid(pp); origin = "sysfs"; } - if (len <= 0) - len = uid_fallback(pp, path_state, &origin, len); + if (len <= 0 && has_uid_fallback(pp)) { + int retrigger_tries; + + conf = get_multipath_config(); + retrigger_tries = conf->retrigger_tries; + put_multipath_config(conf); + if (pp->retriggers >= retrigger_tries) + len = uid_fallback(pp, path_state, &origin); + } } if ( len < 0 ) { condlog(1, "%s: failed to get %s uid: %s", -- 2.17.2 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel