[dm-devel] [PATCH 3/4] Add 'none' checker
Hannes Reinecke
hare at suse.de
Fri Sep 15 06:30:29 UTC 2017
For NVMe we don't have a good way of checking the path state, so
add a new checker 'none' which doesn't do any checking, but rely
on the internal sysfs state for path checking.
Signed-off-by: Hannes Reinecke <hare at suse.com>
---
libmultipath/checkers.c | 22 ++++++++++++++++------
libmultipath/checkers.h | 3 ++-
libmultipath/discovery.c | 10 ++++++----
libmultipath/discovery.h | 2 +-
multipath/multipath.conf.5 | 3 +++
multipathd/main.c | 2 +-
6 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c
index c32f727..cd6d6a3 100644
--- a/libmultipath/checkers.c
+++ b/libmultipath/checkers.c
@@ -19,6 +19,7 @@ char *checker_state_names[] = {
"timeout",
"removed",
"delayed",
+ "none",
};
static LIST_HEAD(checkers);
@@ -102,6 +103,8 @@ struct checker * add_checker (char *multipath_dir, char * name)
if (!c)
return NULL;
snprintf(c->name, CHECKER_NAME_LEN, "%s", name);
+ if (!strncmp(c->name, NONE, 4))
+ goto done;
snprintf(libname, LIB_CHECKER_NAMELEN, "%s/libcheck%s.so",
multipath_dir, name);
if (stat(libname,&stbuf) < 0) {
@@ -145,7 +148,7 @@ struct checker * add_checker (char *multipath_dir, char * name)
condlog(0, "A dynamic linking error occurred: (%s)", errstr);
if (!c->repair)
goto out;
-
+done:
c->fd = -1;
c->sync = 1;
list_add(&c->node, &checkers);
@@ -195,14 +198,16 @@ int checker_init (struct checker * c, void ** mpctxt_addr)
if (!c)
return 1;
c->mpcontext = mpctxt_addr;
- return c->init(c);
+ if (c->init)
+ return c->init(c);
+ return 0;
}
void checker_put (struct checker * dst)
{
struct checker * src;
- if (!dst || !dst->check)
+ if (!dst || !strlen(dst->name))
return;
src = checker_lookup(dst->name);
if (dst->free)
@@ -221,11 +226,11 @@ void checker_repair (struct checker * c)
MSG(c, "checker disabled");
return;
}
-
- c->repair(c);
+ if (c->repair)
+ c->repair(c);
}
-int checker_check (struct checker * c)
+int checker_check (struct checker * c, int path_state)
{
int r;
@@ -237,6 +242,9 @@ int checker_check (struct checker * c)
MSG(c, "checker disabled");
return PATH_UNCHECKED;
}
+ if (!strncmp(c->name, NONE, 4))
+ return path_state;
+
if (c->fd < 0) {
MSG(c, "no usable fd");
return PATH_WILD;
@@ -250,6 +258,8 @@ int checker_selected (struct checker * c)
{
if (!c)
return 0;
+ if (!strncmp(c->name, NONE, 4))
+ return 1;
return (c->check) ? 1 : 0;
}
diff --git a/libmultipath/checkers.h b/libmultipath/checkers.h
index 1d225de..713399f 100644
--- a/libmultipath/checkers.h
+++ b/libmultipath/checkers.h
@@ -85,6 +85,7 @@ enum path_check_state {
#define EMC_CLARIION "emc_clariion"
#define READSECTOR0 "readsector0"
#define CCISS_TUR "cciss_tur"
+#define NONE "none"
#define RBD "rbd"
#define ASYNC_TIMEOUT_SEC 30
@@ -135,7 +136,7 @@ void checker_set_fd (struct checker *, int);
void checker_enable (struct checker *);
void checker_disable (struct checker *);
void checker_repair (struct checker *);
-int checker_check (struct checker *);
+int checker_check (struct checker *, int);
int checker_selected (struct checker *);
char * checker_name (struct checker *);
char * checker_message (struct checker *);
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index a880f4b..225fd4d 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -1550,7 +1550,7 @@ cciss_ioctl_pathinfo (struct path * pp, int mask)
}
int
-get_state (struct path * pp, struct config *conf, int daemon)
+get_state (struct path * pp, struct config *conf, int daemon, int oldstate)
{
struct checker * c = &pp->checker;
int state;
@@ -1588,8 +1588,9 @@ get_state (struct path * pp, struct config *conf, int daemon)
if (!conf->checker_timeout &&
sysfs_get_timeout(pp, &(c->timeout)) <= 0)
c->timeout = DEF_TIMEOUT;
- state = checker_check(c);
- condlog(3, "%s: state = %s", pp->dev, checker_state_name(state));
+ state = checker_check(c, oldstate);
+ condlog(3, "%s: %s state = %s", pp->dev,
+ checker_name(c), checker_state_name(state));
if (state != PATH_UP && state != PATH_GHOST &&
strlen(checker_message(c)))
condlog(3, "%s: checker msg is \"%s\"",
@@ -1960,7 +1961,8 @@ int pathinfo(struct path *pp, struct config *conf, int mask)
if (mask & DI_CHECKER) {
if (path_state == PATH_UP) {
- pp->chkrstate = pp->state = get_state(pp, conf, 0);
+ pp->chkrstate = pp->state = get_state(pp, conf, 0,
+ path_state);
if (pp->state == PATH_UNCHECKED ||
pp->state == PATH_WILD)
goto blank;
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index 51c23d6..6a54b78 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -34,7 +34,7 @@ int path_discovery (vector pathvec, int flag);
int do_tur (char *);
int path_offline (struct path *);
-int get_state (struct path * pp, struct config * conf, int daemon);
+int get_state (struct path * pp, struct config * conf, int daemon, int state);
int get_vpd_sgio (int fd, int pg, char * str, int maxlen);
int pathinfo (struct path * pp, struct config * conf, int mask);
int alloc_path_with_pathinfo (struct config *conf, struct udev_device *udevice,
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
index d9ac279..e0cada3 100644
--- a/multipath/multipath.conf.5
+++ b/multipath/multipath.conf.5
@@ -451,6 +451,9 @@ Please use \fItur\fR instead.
(Hardware-dependent)
Check the path state for HP/COMPAQ Smart Array(CCISS) controllers.
.TP
+.I none
+Do not check the device, fallback to use the values retrieved from sysfs
+.TP
.I rbd
Check if the path is in the Ceph blacklist and remap the path if it is.
.TP
diff --git a/multipathd/main.c b/multipathd/main.c
index 4be2c57..657ff83 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1623,7 +1623,7 @@ check_path (struct vectors * vecs, struct path * pp, int ticks)
if (newstate == PATH_UP) {
conf = get_multipath_config();
- newstate = get_state(pp, conf, 1);
+ newstate = get_state(pp, conf, 1, newstate);
put_multipath_config(conf);
} else
checker_clear_message(&pp->checker);
--
1.8.5.6
More information about the dm-devel
mailing list