mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
svcrdma: Add a "deferred close" helper
Refactor a bit of commonly used logic so that every site that wants a close deferred to an nfsd thread does all the right things (set_bit(XPT_CLOSE) then enqueue). Also, once XPT_CLOSE is set on a transport, it is never cleared. If XPT_CLOSE is already set, then the close is already being handled and the enqueue can be skipped. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
@@ -728,10 +728,8 @@ static void svc_tcp_state_change(struct sock *sk)
|
||||
rmb();
|
||||
svsk->sk_ostate(sk);
|
||||
trace_svcsock_tcp_state(&svsk->sk_xprt, svsk->sk_sock);
|
||||
if (sk->sk_state != TCP_ESTABLISHED) {
|
||||
set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
|
||||
svc_xprt_enqueue(&svsk->sk_xprt);
|
||||
}
|
||||
if (sk->sk_state != TCP_ESTABLISHED)
|
||||
svc_xprt_deferred_close(&svsk->sk_xprt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -901,7 +899,7 @@ err_too_large:
|
||||
net_notice_ratelimited("svc: %s %s RPC fragment too large: %d\n",
|
||||
__func__, svsk->sk_xprt.xpt_server->sv_name,
|
||||
svc_sock_reclen(svsk));
|
||||
set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
|
||||
svc_xprt_deferred_close(&svsk->sk_xprt);
|
||||
err_short:
|
||||
return -EAGAIN;
|
||||
}
|
||||
@@ -1057,7 +1055,7 @@ err_nuts:
|
||||
svsk->sk_datalen = 0;
|
||||
err_delete:
|
||||
trace_svcsock_tcp_recv_err(&svsk->sk_xprt, len);
|
||||
set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
|
||||
svc_xprt_deferred_close(&svsk->sk_xprt);
|
||||
err_noclose:
|
||||
return 0; /* record not complete */
|
||||
}
|
||||
@@ -1188,8 +1186,7 @@ out_close:
|
||||
xprt->xpt_server->sv_name,
|
||||
(err < 0) ? "got error" : "sent",
|
||||
(err < 0) ? err : sent, xdr->len);
|
||||
set_bit(XPT_CLOSE, &xprt->xpt_flags);
|
||||
svc_xprt_enqueue(xprt);
|
||||
svc_xprt_deferred_close(xprt);
|
||||
atomic_dec(&svsk->sk_sendqlen);
|
||||
mutex_unlock(&xprt->xpt_mutex);
|
||||
return -EAGAIN;
|
||||
@@ -1268,7 +1265,7 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
|
||||
case TCP_ESTABLISHED:
|
||||
break;
|
||||
default:
|
||||
set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
|
||||
svc_xprt_deferred_close(&svsk->sk_xprt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user