@@ -1076,18 +1076,16 @@ detect_alua(struct path * pp)
return;
}
- if (pp->fd == -1 || pp->offline)
+ if (pp->fd == -1 || pp->sysfs_state == PATH_DOWN)
return;
ret = get_target_port_group(pp);
if (ret < 0 || get_asymmetric_access_state(pp, ret) < 0) {
- int state;
-
if (ret == -RTPG_INQUIRY_FAILED)
return;
- state = path_offline(pp);
- if (state != PATH_UP)
+ path_sysfs_state(pp);
+ if (pp->sysfs_state != PATH_UP)
return;
pp->tpgs = TPGS_NONE;
@@ -1800,7 +1798,7 @@ common_sysfs_pathinfo (struct path * pp)
}
int
-path_offline (struct path * pp)
+path_sysfs_state(struct path * pp)
{
struct udev_device * parent;
char buff[SCSI_STATE_SIZE];
@@ -1814,7 +1812,8 @@ path_offline (struct path * pp)
subsys_type = "nvme";
}
else {
- return PATH_UP;
+ pp->sysfs_state = PATH_UP;
+ goto out;
}
parent = pp->udev;
@@ -1827,16 +1826,18 @@ path_offline (struct path * pp)
if (!parent) {
condlog(1, "%s: failed to get sysfs information", pp->dev);
- return PATH_REMOVED;
+ pp->sysfs_state = PATH_REMOVED;
+ goto out;
}
memset(buff, 0x0, SCSI_STATE_SIZE);
err = sysfs_attr_get_value(parent, "state", buff, sizeof(buff));
if (!sysfs_attr_value_ok(err, sizeof(buff))) {
if (err == -ENXIO)
- return PATH_REMOVED;
+ pp->sysfs_state = PATH_REMOVED;
else
- return PATH_DOWN;
+ pp->sysfs_state = PATH_DOWN;
+ goto out;
}
@@ -1844,31 +1845,34 @@ path_offline (struct path * pp)
if (pp->bus == SYSFS_BUS_SCSI) {
if (!strncmp(buff, "offline", 7)) {
- pp->offline = 1;
- return PATH_DOWN;
+ pp->sysfs_state = PATH_DOWN;
+ goto out;
+ } else if (!strncmp(buff, "blocked", 7) ||
+ !strncmp(buff, "quiesce", 7)) {
+ pp->sysfs_state = PATH_PENDING;
+ goto out;
+ } else if (!strncmp(buff, "running", 7)) {
+ pp->sysfs_state = PATH_UP;
+ goto out;
}
- pp->offline = 0;
- if (!strncmp(buff, "blocked", 7) ||
- !strncmp(buff, "quiesce", 7))
- return PATH_PENDING;
- else if (!strncmp(buff, "running", 7))
- return PATH_UP;
}
else if (pp->bus == SYSFS_BUS_NVME) {
if (!strncmp(buff, "dead", 4)) {
- pp->offline = 1;
- return PATH_DOWN;
+ pp->sysfs_state = PATH_DOWN;
+ goto out;
+ } else if (!strncmp(buff, "new", 3) ||
+ !strncmp(buff, "deleting", 8)) {
+ pp->sysfs_state = PATH_PENDING;
+ goto out;
+ } else if (!strncmp(buff, "live", 4)) {
+ pp->sysfs_state = PATH_UP;
+ goto out;
}
- pp->offline = 0;
- if (!strncmp(buff, "new", 3) ||
- !strncmp(buff, "deleting", 8))
- return PATH_PENDING;
- else if (!strncmp(buff, "live", 4))
- return PATH_UP;
}
-
- return PATH_DOWN;
+ pp->sysfs_state = PATH_DOWN;
+out:
+ return pp->sysfs_state;
}
static int
@@ -2052,8 +2056,7 @@ get_prio (struct path * pp)
old_prio = pp->priority;
pp->priority = prio_getprio(p, pp);
if (pp->priority < 0) {
- /* this changes pp->offline, but why not */
- int state = path_offline(pp);
+ int state = path_sysfs_state(pp);
if (state == PATH_DOWN || state == PATH_PENDING) {
pp->priority = old_prio;
@@ -2424,7 +2427,7 @@ int pathinfo(struct path *pp, struct config *conf, int mask)
return PATHINFO_SKIPPED;
}
- path_state = path_offline(pp);
+ path_state = path_sysfs_state(pp);
if (path_state == PATH_REMOVED)
goto blank;
else if (mask & DI_NOIO) {
@@ -33,7 +33,7 @@ struct config;
int path_discovery (vector pathvec, int flag);
int path_get_tpgs(struct path *pp); /* This function never returns TPGS_UNDEF */
int do_tur (char *);
-int path_offline (struct path *);
+int path_sysfs_state(struct path *);
int start_checker(struct path * pp, struct config * conf, int daemon,
int state);
int get_state(struct path * pp);
@@ -146,7 +146,7 @@ global:
path_discovery;
path_get_tpgs;
pathinfo;
- path_offline;
+ path_sysfs_state;
print_all_paths;
print_foreign_topology;
print_multipath_topology__;
@@ -160,6 +160,7 @@ global:
remove_wwid;
replace_wwids;
reset_checker_classes;
+ start_checker;
select_all_tg_pt;
select_action;
select_find_multipaths_timeout;
@@ -514,7 +514,7 @@ snprint_offline (struct strbuf *buff, const struct path * pp)
{
if (!pp || !pp->mpp)
return append_strbuf_str(buff, "unknown");
- else if (pp->offline)
+ else if (pp->sysfs_state == PATH_DOWN)
return append_strbuf_str(buff, "offline");
else
return append_strbuf_str(buff, "running");
@@ -362,7 +362,7 @@ struct path {
unsigned int tick;
unsigned int pending_ticks;
int bus;
- int offline;
+ int sysfs_state;
int state;
int dmstate;
int chkrstate;
@@ -96,7 +96,7 @@ void * mpath_pr_event_handler_fn (void * );
do { \
if (pp->mpp && checker_selected(&pp->checker) && \
lvl <= libmp_verbosity) { \
- if (pp->offline) \
+ if (pp->sysfs_state == PATH_DOWN) \
condlog(lvl, "%s: %s - path offline", \
pp->mpp->alias, pp->dev); \
else { \
@@ -2320,7 +2320,7 @@ check_path_state(struct path *pp)
int newstate;
struct config *conf;
- newstate = path_offline(pp);
+ newstate = path_sysfs_state(pp);
if (newstate == PATH_UP) {
conf = get_multipath_config();
pthread_cleanup_push(put_multipath_config, conf);
Instead of pp->offline being a binary value, change it to show the actual result of looking at the sysfs state, and rename it to pp->sysfs_state. Also change the function name from path_offline() to path_sysfs_state(). Adapt the tests for pp->offline. This should not change how multipath currently works. pp->sysfs_state will be used in future patches. Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> --- libmultipath/discovery.c | 65 ++++++++++++++++--------------- libmultipath/discovery.h | 2 +- libmultipath/libmultipath.version | 3 +- libmultipath/print.c | 2 +- libmultipath/structs.h | 2 +- multipathd/main.c | 4 +- 6 files changed, 41 insertions(+), 37 deletions(-)