• Chuck Lever's avatar
    SUNRPC: Fix NFSD's request deferral on RDMA transports · 773f91b2
    Chuck Lever authored
    Trond Myklebust reports an NFSD crash in svc_rdma_sendto(). Further
    investigation shows that the crash occurred while NFSD was handling
    a deferred request.
    
    This patch addresses two inter-related issues that prevent request
    deferral from working correctly for RPC/RDMA requests:
    
    1. Prevent the crash by ensuring that the original
       svc_rqst::rq_xprt_ctxt value is available when the request is
       revisited. Otherwise svc_rdma_sendto() does not have a Receive
       context available with which to construct its reply.
    
    2. Possibly since before commit 71641d99 ("svcrdma: Properly
       compute .len and .buflen for received RPC Calls"),
       svc_rdma_recvfrom() did not include the transport header in the
       returned xdr_buf. There should have been no need for svc_defer()
       and friends to save and restore that header, as of that commit.
       This issue is addressed in a backport-friendly way by simply
       having svc_rdma_recvfrom() set rq_xprt_hlen to zero
       unconditionally, just as svc_tcp_recvfrom() does. This enables
       svc_deferred_recv() to correctly reconstruct an RPC message
       received via RPC/RDMA.
    Reported-by: default avatarTrond Myklebust <trondmy@hammerspace.com>
    Link: https://lore.kernel.org/linux-nfs/82662b7190f26fb304eb0ab1bb04279072439d4e.camel@hammerspace.com/Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Cc: <stable@vger.kernel.org>
    773f91b2
svc_xprt.c 39.1 KB