svcrdma: Add a "deferred close" helper
[sfrench/cifs-2.6.git] / net / sunrpc / svcsock.c
index 2e2f007dfc9f1ff9d5e367f97bc1d0480e9ab506..22454b2df5be1e74a4ae1df86f61dea0873809da 100644 (file)
@@ -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);
                }
        }
 }