checker_check() is now a void function that stores the path state in
the checker struct. It can be retrieved later using checker_get_state().
Right now, this is called immediately after checker_check(), but in
the future, it can be deferred to another time.

Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>
---
 libmultipath/checkers.c  | 26 +++++++++++++-------------
 libmultipath/checkers.h  |  4 +++-
 libmultipath/discovery.c |  3 ++-
 3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c
index fdb91e17..c4918d28 100644
--- a/libmultipath/checkers.c
+++ b/libmultipath/checkers.c
@@ -299,28 +299,28 @@ void checker_put (struct checker * dst)
        free_checker_class(src);
 }
 
-int checker_check (struct checker * c, int path_state)
+int checker_get_state(struct checker *c)
 {
-       int r;
+       return c ? c->path_state : PATH_UNCHECKED;
+}
 
+void checker_check (struct checker * c, int path_state)
+{
        if (!c)
-               return PATH_WILD;
+               return;
 
        c->msgid = CHECKER_MSGID_NONE;
        if (c->disable) {
                c->msgid = CHECKER_MSGID_DISABLED;
-               return PATH_UNCHECKED;
-       }
-       if (!strncmp(c->cls->name, NONE, 4))
-               return path_state;
-
-       if (c->fd < 0) {
+               c->path_state = PATH_UNCHECKED;
+       } else if (!strncmp(c->cls->name, NONE, 4)) {
+               c->path_state = path_state;
+       } else if (c->fd < 0) {
                c->msgid = CHECKER_MSGID_NO_FD;
-               return PATH_WILD;
+               c->path_state = PATH_WILD;
+       } else {
+               c->path_state = c->cls->check(c);
        }
-       r = c->cls->check(c);
-
-       return r;
 }
 
 const char *checker_name(const struct checker *c)
diff --git a/libmultipath/checkers.h b/libmultipath/checkers.h
index 102351f6..6e54d8f0 100644
--- a/libmultipath/checkers.h
+++ b/libmultipath/checkers.h
@@ -123,6 +123,7 @@ struct checker {
        int fd;
        unsigned int timeout;
        int disable;
+       int path_state;
        short msgid;                         /* checker-internal extra status */
        void * context;                      /* store for persistent data */
        void ** mpcontext;                   /* store for persistent data shared
@@ -169,7 +170,8 @@ struct checker_context {
 };
 int start_checker_thread (pthread_t *thread, const pthread_attr_t *attr,
                          struct checker_context *ctx);
-int checker_check (struct checker *, int);
+int checker_get_state(struct checker *c);
+void checker_check (struct checker *, int);
 int checker_is_sync(const struct checker *);
 const char *checker_name (const struct checker *);
 void reset_checker_classes(void);
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index e94705bf..5648be60 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -2007,7 +2007,8 @@ get_state (struct path * pp, struct config *conf, int 
daemon, int oldstate)
                checker_set_async(c);
        else
                checker_set_sync(c);
-       state = checker_check(c, oldstate);
+       checker_check(c, oldstate);
+       state = checker_get_state(c);
        condlog(3, "%s: %s state = %s", pp->dev,
                checker_name(c), checker_state_name(state));
        if (state != PATH_UP && state != PATH_GHOST &&
-- 
2.45.0


Reply via email to