Instead of open-coding mostly the same work, just make mpath_prout_rel()
call check_holding_reservation().

Signed-off-by: Benjamin Marzinski <[email protected]>
---
 libmpathpersist/mpath_persist_int.c | 86 ++++++++++++-----------------
 1 file changed, 35 insertions(+), 51 deletions(-)

diff --git a/libmpathpersist/mpath_persist_int.c 
b/libmpathpersist/mpath_persist_int.c
index 33c9e57a..9c71011f 100644
--- a/libmpathpersist/mpath_persist_int.c
+++ b/libmpathpersist/mpath_persist_int.c
@@ -639,12 +639,42 @@ static int preempt_all(struct multipath *mpp, int 
rq_servact, int rq_scope,
                               noisy, false);
 }
 
+static int reservation_key_matches(struct multipath *mpp, uint8_t *key,
+                                  unsigned int *type)
+{
+       struct prin_resp resp = {{{.prgeneration = 0}}};
+       int status;
+
+       status = mpath_prin_activepath(mpp, MPATH_PRIN_RRES_SA, &resp, 0);
+       if (status != MPATH_PR_SUCCESS) {
+               condlog(0, "%s: pr in read reservation command failed.", 
mpp->wwid);
+               return YNU_UNDEF;
+       }
+       if (!resp.prin_descriptor.prin_readresv.additional_length)
+               return YNU_NO;
+       if (memcmp(key, resp.prin_descriptor.prin_readresv.key, 8) == 0) {
+               if (type)
+                       *type = resp.prin_descriptor.prin_readresv.scope_type &
+                               MPATH_PR_TYPE_MASK;
+               return YNU_YES;
+       }
+       return YNU_NO;
+}
+
+static bool check_holding_reservation(struct multipath *mpp, unsigned int 
*type)
+{
+       if (get_be64(mpp->reservation_key) &&
+           get_prhold(mpp->alias) == PR_SET &&
+           reservation_key_matches(mpp, (uint8_t *)&mpp->reservation_key, 
type) == YNU_YES)
+               return true;
+       return false;
+}
+
 static int mpath_prout_rel(struct multipath *mpp,int rq_servact, int rq_scope,
                           unsigned int rq_type,
                           struct prout_param_descriptor * paramp, int noisy)
 {
        int i, j;
-       int num = 0;
        struct pathgroup *pgp = NULL;
        struct path *pp = NULL;
        int active_pathcount = 0;
@@ -652,9 +682,8 @@ static int mpath_prout_rel(struct multipath *mpp,int 
rq_servact, int rq_scope,
        int rc;
        int count = 0;
        int status = MPATH_PR_SUCCESS;
-       struct prin_resp resp = {{{.prgeneration = 0}}};
        bool all_threads_failed;
-       unsigned int scope_type;
+       unsigned int res_type;
 
        if (!mpp)
                return MPATH_PR_DMMP_ERROR;
@@ -733,27 +762,13 @@ static int mpath_prout_rel(struct multipath *mpp,int 
rq_servact, int rq_scope,
                return status;
        }
 
-       status = mpath_prin_activepath (mpp, MPATH_PRIN_RRES_SA, &resp, noisy);
-       if (status != MPATH_PR_SUCCESS){
-               condlog (0, "%s: pr in read reservation command failed.", 
mpp->wwid);
-               return MPATH_PR_OTHER;
-       }
-
-       num = resp.prin_descriptor.prin_readresv.additional_length / 8;
-       if (num == 0){
-               condlog (2, "%s: Path holding reservation is released.", 
mpp->wwid);
-               return MPATH_PR_SUCCESS;
-       }
-       if (!get_be64(mpp->reservation_key) ||
-           memcmp(&mpp->reservation_key, 
resp.prin_descriptor.prin_readresv.key, 8)) {
+       if (!check_holding_reservation(mpp, &res_type)) {
                condlog(2, "%s: Releasing key not holding reservation.", 
mpp->wwid);
                return MPATH_PR_SUCCESS;
        }
-
-       scope_type = resp.prin_descriptor.prin_readresv.scope_type;
-       if ((scope_type & MPATH_PR_TYPE_MASK) != rq_type) {
+       if (res_type != rq_type) {
                condlog(2, "%s: --prout_type %u doesn't match reservation %u",
-                       mpp->wwid, rq_type, scope_type & MPATH_PR_TYPE_MASK);
+                       mpp->wwid, rq_type, res_type);
                return MPATH_PR_RESERV_CONFLICT;
        }
 
@@ -773,28 +788,6 @@ static int mpath_prout_rel(struct multipath *mpp,int 
rq_servact, int rq_scope,
        return preempt_self(mpp, MPATH_PROUT_PREE_SA, rq_scope, rq_type, noisy, 
true);
 }
 
-static int reservation_key_matches(struct multipath *mpp, uint8_t *key,
-                                  unsigned int *type)
-{
-       struct prin_resp resp = {{{.prgeneration = 0}}};
-       int status;
-
-       status = mpath_prin_activepath(mpp, MPATH_PRIN_RRES_SA, &resp, 0);
-       if (status != MPATH_PR_SUCCESS) {
-               condlog(0, "%s: pr in read reservation command failed.", 
mpp->wwid);
-               return YNU_UNDEF;
-       }
-       if (!resp.prin_descriptor.prin_readresv.additional_length)
-               return YNU_NO;
-       if (memcmp(key, resp.prin_descriptor.prin_readresv.key, 8) == 0) {
-               if (type)
-                       *type = resp.prin_descriptor.prin_readresv.scope_type &
-                               MPATH_PR_TYPE_MASK;
-               return YNU_YES;
-       }
-       return YNU_NO;
-}
-
 /*
  * for MPATH_PROUT_REG_IGN_SA, we use the ignored paramp->key to store the
  * currently registered key for use in preempt_missing_path(), but only if
@@ -813,15 +806,6 @@ static void set_ignored_key(struct multipath *mpp, uint8_t 
*curr_key,
        memcpy(key, curr_key, 8);
 }
 
-static bool check_holding_reservation(struct multipath *mpp, unsigned int 
*type)
-{
-       if (get_be64(mpp->reservation_key) &&
-           get_prhold(mpp->alias) == PR_SET &&
-           reservation_key_matches(mpp, (uint8_t *)&mpp->reservation_key, 
type) == YNU_YES)
-               return true;
-       return false;
-}
-
 int do_mpath_persistent_reserve_out(vector curmp, vector pathvec, int fd,
                                    int rq_servact, int rq_scope, unsigned int 
rq_type,
                                    struct prout_param_descriptor *paramp, int 
noisy)
-- 
2.50.1


Reply via email to