From: Hannes Reinecke Date: Thu, 27 May 2010 11:53:43 +0000 (+0200) Subject: libmultipath: Remove duplicate calls to path_offline() X-Git-Tag: upstream/0.5.0~106^2~22 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d982709f814bfb496f22b78b5951016957a00cf8;p=platform%2Fupstream%2Fmultipath-tools.git libmultipath: Remove duplicate calls to path_offline() When calling pathinfo() path_offline() is called several times in a row, which is quite unnecessary. Signed-off-by: Hannes Reinecke --- diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index 077e0cc..a612fb8 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -796,11 +796,6 @@ get_state (struct path * pp, int daemon) } } checker_clear_message(c); - state = path_offline(pp); - if (state != PATH_UP) { - condlog(3, "%s: path inaccessible", pp->dev); - return state; - } if (daemon) checker_set_async(c); if (!conf->checker_timeout) @@ -819,12 +814,6 @@ get_prio (struct path * pp) if (!pp) return 0; - path_state = path_offline(pp); - if (path_state != PATH_UP) { - pp->priority = PRIO_UNDEF; - return 0; - } - if (!pp->prio) { select_prio(pp); if (!pp->prio) { @@ -874,6 +863,8 @@ get_uid (struct path * pp) extern int pathinfo (struct path *pp, vector hwtable, int mask) { + int path_state; + condlog(3, "%s: mask = 0x%x", pp->dev, mask); /* @@ -882,6 +873,8 @@ pathinfo (struct path *pp, vector hwtable, int mask) if (mask & DI_SYSFS && sysfs_pathinfo(pp)) return 1; + path_state = path_offline(pp); + /* * fetch info not available through sysfs */ @@ -897,7 +890,7 @@ pathinfo (struct path *pp, vector hwtable, int mask) if (mask & DI_SERIAL) get_geometry(pp); - if (pp->bus == SYSFS_BUS_SCSI && + if (path_state == PATH_UP && pp->bus == SYSFS_BUS_SCSI && scsi_ioctl_pathinfo(pp, mask)) goto blank; @@ -906,23 +899,32 @@ pathinfo (struct path *pp, vector hwtable, int mask) goto blank; if (mask & DI_CHECKER) { - pp->state = get_state(pp, 0); - if (pp->state == PATH_UNCHECKED || pp->state == PATH_WILD) - goto blank; + if (path_state == PATH_UP) { + pp->state = get_state(pp, 0); + if (pp->state == PATH_UNCHECKED || + pp->state == PATH_WILD) + goto blank; + } else { + condlog(3, "%s: path inaccessible", pp->dev); + pp->state = path_state; + } } /* * Retrieve path priority, even for PATH_DOWN paths if it has never * been successfully obtained before. */ - if (mask & DI_PRIO && - (pp->state != PATH_DOWN || pp->priority == PRIO_UNDEF)) { - if (!strlen(pp->wwid)) - get_uid(pp); - get_prio(pp); + if ((mask & DI_PRIO) && path_state == PATH_UP) { + if (pp->state != PATH_DOWN || pp->priority == PRIO_UNDEF) { + if (!strlen(pp->wwid)) + get_uid(pp); + get_prio(pp); + } else { + pp->priority = PRIO_UNDEF; + } } - if (mask & DI_WWID && !strlen(pp->wwid)) + if (path_state == PATH_UP && (mask & DI_WWID) && !strlen(pp->wwid)) get_uid(pp); return 0; diff --git a/multipathd/main.c b/multipathd/main.c index 2584aec..6008d77 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -1003,7 +1003,9 @@ check_path (struct vectors * vecs, struct path * pp) */ pp->tick = conf->checkint; - newstate = get_state(pp, 1); + newstate = path_offline(pp); + if (newstate == PATH_UP) + newstate = get_state(pp, 1); if (newstate == PATH_WILD || newstate == PATH_UNCHECKED) { condlog(2, "%s: unusable path", pp->dev);