mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
dlm: another call to confirm_master in receive_request_reply
When a failed request (EBADR or ENOTBLK) is unlocked/canceled instead of retried, there may be other lkb's waiting on the rsb_lookup list for it to complete. A call to confirm_master() is needed to move on to the next waiting lkb since the current one won't be retried. Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
601342ce02
commit
aec64e1be2
1 changed files with 6 additions and 2 deletions
|
@ -1940,8 +1940,11 @@ static void confirm_master(struct dlm_rsb *r, int error)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case -EAGAIN:
|
case -EAGAIN:
|
||||||
/* the remote master didn't queue our NOQUEUE request;
|
case -EBADR:
|
||||||
make a waiting lkb the first_lkid */
|
case -ENOTBLK:
|
||||||
|
/* the remote request failed and won't be retried (it was
|
||||||
|
a NOQUEUE, or has been canceled/unlocked); make a waiting
|
||||||
|
lkb the first_lkid */
|
||||||
|
|
||||||
r->res_first_lkid = 0;
|
r->res_first_lkid = 0;
|
||||||
|
|
||||||
|
@ -3382,6 +3385,7 @@ static void receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms)
|
||||||
if (is_overlap(lkb)) {
|
if (is_overlap(lkb)) {
|
||||||
/* we'll ignore error in cancel/unlock reply */
|
/* we'll ignore error in cancel/unlock reply */
|
||||||
queue_cast_overlap(r, lkb);
|
queue_cast_overlap(r, lkb);
|
||||||
|
confirm_master(r, result);
|
||||||
unhold_lkb(lkb); /* undoes create_lkb() */
|
unhold_lkb(lkb); /* undoes create_lkb() */
|
||||||
} else
|
} else
|
||||||
_request_lock(r, lkb);
|
_request_lock(r, lkb);
|
||||||
|
|
Loading…
Reference in a new issue