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