When prflag is unset, prhold and sa_flags should also be unset. A future
patch will add another variable to be set when prflag is set. Wrap all
these actions in set_pr() and unset_pr().

Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>
---
 multipathd/cli_handlers.c | 11 +++++------
 multipathd/main.c         | 34 ++++++++++++++++++++--------------
 multipathd/main.h         |  2 ++
 3 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 34910c9b..c1051c85 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -1290,7 +1290,7 @@ cli_setprstatus(void * v, struct strbuf *reply, void * 
data)
                return -ENODEV;
 
        if (mpp->prflag != PR_SET) {
-               mpp->prflag = PR_SET;
+               set_pr(mpp);
                condlog(2, "%s: prflag set", param);
        }
 
@@ -1311,12 +1311,11 @@ cli_unsetprstatus(void * v, struct strbuf *reply, void 
* data)
                return -ENODEV;
 
        if (mpp->prflag != PR_UNSET) {
-               mpp->prflag = PR_UNSET;
                condlog(2, "%s: prflag unset", param);
-       }
-       if (mpp->prhold != PR_UNSET) {
-               mpp->prhold = PR_UNSET;
-               condlog(2, "%s: prhold unset (by clearing prflag)", param);
+               if (mpp->prhold != PR_UNSET)
+                       condlog(2, "%s: prhold unset (by clearing prflag)",
+                               param);
+               unset_pr(mpp);
        }
 
        return 0;
diff --git a/multipathd/main.c b/multipathd/main.c
index 0e95ca3a..c1ed1488 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -4227,10 +4227,6 @@ static void check_prhold(struct multipath *mpp, struct 
path *pp)
        struct prin_resp resp = {0};
        int status;
 
-       if (mpp->prflag == PR_UNSET) {
-               mpp->prhold = PR_UNSET;
-               return;
-       }
        if (mpp->prflag != PR_SET || mpp->prhold != PR_UNKNOWN)
                return;
 
@@ -4248,6 +4244,18 @@ static void check_prhold(struct multipath *mpp, struct 
path *pp)
                mpp->prhold = PR_SET;
 }
 
+void set_pr(struct multipath *mpp)
+{
+       mpp->prflag = PR_SET;
+}
+
+void unset_pr(struct multipath *mpp)
+{
+       mpp->prflag = PR_UNSET;
+       mpp->prhold = PR_UNSET;
+       mpp->sa_flags = 0;
+}
+
 static int update_map_pr(struct multipath *mpp, struct path *pp)
 {
        int noisy=0;
@@ -4262,7 +4270,7 @@ static int update_map_pr(struct multipath *mpp, struct 
path *pp)
 
        if (!get_be64(mpp->reservation_key)) {
                /* Nothing to do. Assuming pr mgmt feature is disabled*/
-               mpp->prflag = PR_UNSET;
+               unset_pr(mpp);
                condlog(was_set ? 2 : 4, "%s: reservation_key not set in 
multipath.conf", mpp->alias);
                return MPATH_PR_SKIP;
        }
@@ -4272,11 +4280,10 @@ static int update_map_pr(struct multipath *mpp, struct 
path *pp)
        ret = prin_do_scsi_ioctl(pp->dev, MPATH_PRIN_RKEY_SA, &resp, noisy);
        if (ret != MPATH_PR_SUCCESS) {
                if (ret == MPATH_PR_ILLEGAL_REQ)
-                       mpp->prflag = PR_UNSET;
+                       unset_pr(mpp);
                condlog(0,"%s : pr in read keys service action failed 
Error=%d", mpp->alias, ret);
                return ret;
        }
-       mpp->prflag = PR_UNSET;
 
        condlog(4, "%s: Multipath reservation_key: 0x%" PRIx64 " ", mpp->alias,
                get_be64(mpp->reservation_key));
@@ -4296,12 +4303,14 @@ static int update_map_pr(struct multipath *mpp, struct 
path *pp)
        }
 
        if (isFound) {
-               mpp->prflag = PR_SET;
+               set_pr(mpp);
                condlog(was_set ? 3 : 2, "%s: key found. prflag set.",
                        mpp->alias);
-       } else
+       } else {
+               unset_pr(mpp);
                condlog(was_set ? 1 : 3, "%s: key not found. prflag unset.",
                        mpp->alias);
+       }
 
        return MPATH_PR_SUCCESS;
 }
@@ -4313,15 +4322,12 @@ static void mpath_pr_event_handle(struct path *pp)
        struct prout_param_descriptor param;
 
        if (pp->bus != SYSFS_BUS_SCSI) {
-               mpp->prflag = PR_UNSET;
+               unset_pr(mpp);
                return;
        }
 
-       if (update_map_pr(mpp, pp) != MPATH_PR_SUCCESS) {
-               if (mpp->prflag == PR_UNSET)
-                       mpp->prhold = PR_UNSET;
+       if (update_map_pr(mpp, pp) != MPATH_PR_SUCCESS)
                return;
-       }
 
        check_prhold(mpp, pp);
 
diff --git a/multipathd/main.h b/multipathd/main.h
index c94362e4..29b57e3d 100644
--- a/multipathd/main.h
+++ b/multipathd/main.h
@@ -52,4 +52,6 @@ bool check_path_wwid_change(struct path *pp);
 int finish_path_init(struct path *pp, struct vectors * vecs);
 int resize_map(struct multipath *mpp, unsigned long long size,
               struct vectors *vecs);
+void set_pr(struct multipath *mpp);
+void unset_pr(struct multipath *mpp);
 #endif /* MAIN_H_INCLUDED */
-- 
2.48.1


Reply via email to