If none of the threads succeeds in issuing the release, simply return
failure, instead of trying the workaround.

Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>
---
 libmpathpersist/mpath_persist_int.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/libmpathpersist/mpath_persist_int.c 
b/libmpathpersist/mpath_persist_int.c
index 7fb08b2e..ad5a4ee7 100644
--- a/libmpathpersist/mpath_persist_int.c
+++ b/libmpathpersist/mpath_persist_int.c
@@ -475,15 +475,21 @@ static int mpath_prout_rel(struct multipath *mpp,int 
rq_servact, int rq_scope,
                }
        }
 
+       rc = MPATH_PR_DMMP_ERROR;
        for (i = 0; i < count; i++){
                /*  check thread status here and return the status */
 
-               if (thread[i].param.status == MPATH_PR_RESERV_CONFLICT)
+               if (thread[i].param.status == MPATH_PR_SUCCESS)
+                       rc = MPATH_PR_SUCCESS;
+               else if (thread[i].param.status == MPATH_PR_RESERV_CONFLICT)
                        status = MPATH_PR_RESERV_CONFLICT;
-               else if (status == MPATH_PR_SUCCESS
-                               && thread[i].param.status != 
MPATH_PR_RESERV_CONFLICT)
+               else if (status == MPATH_PR_SUCCESS)
                        status = thread[i].param.status;
        }
+       if (rc != MPATH_PR_SUCCESS) {
+               condlog(0, "%s: all threads failed to release reservation.", 
mpp->wwid);
+               return status;
+       }
 
        status = mpath_prin_activepath (mpp, MPATH_PRIN_RRES_SA, &resp, noisy);
        if (status != MPATH_PR_SUCCESS){
-- 
2.48.1


Reply via email to