mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-03 17:40:04 +00:00
ceph: clean up on forwarded aborted mds request
If an mds request is aborted (timeout, SIGKILL), it is left registered to keep our state in sync with the mds. If we get a forward notification, though, we know the request didn't succeed and we can unregister it safely. We were trying to resend it, but then bailing out (and not unregistering) in __do_request. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
79494d1b9b
commit
2a8e5e3637
1 changed files with 9 additions and 4 deletions
|
@ -2014,16 +2014,21 @@ static void handle_forward(struct ceph_mds_client *mdsc,
|
|||
mutex_lock(&mdsc->mutex);
|
||||
req = __lookup_request(mdsc, tid);
|
||||
if (!req) {
|
||||
dout("forward %llu to mds%d - req dne\n", tid, next_mds);
|
||||
dout("forward tid %llu to mds%d - req dne\n", tid, next_mds);
|
||||
goto out; /* dup reply? */
|
||||
}
|
||||
|
||||
if (fwd_seq <= req->r_num_fwd) {
|
||||
dout("forward %llu to mds%d - old seq %d <= %d\n",
|
||||
if (req->r_aborted) {
|
||||
dout("forward tid %llu aborted, unregistering\n", tid);
|
||||
__unregister_request(mdsc, req);
|
||||
} else if (fwd_seq <= req->r_num_fwd) {
|
||||
dout("forward tid %llu to mds%d - old seq %d <= %d\n",
|
||||
tid, next_mds, req->r_num_fwd, fwd_seq);
|
||||
} else {
|
||||
/* resend. forward race not possible; mds would drop */
|
||||
dout("forward %llu to mds%d (we resend)\n", tid, next_mds);
|
||||
dout("forward tid %llu to mds%d (we resend)\n", tid, next_mds);
|
||||
BUG_ON(req->r_err);
|
||||
BUG_ON(req->r_got_result);
|
||||
req->r_num_fwd = fwd_seq;
|
||||
req->r_resend_mds = next_mds;
|
||||
put_request_session(req);
|
||||
|
|
Loading…
Reference in a new issue