• Chuck Lever's avatar
    xprtrdma: Pass only the list of registered MRs to ro_unmap_sync · 451d26e1
    Chuck Lever authored
    There are rare cases where an rpcrdma_req can be re-used (via
    rpcrdma_buffer_put) while the RPC reply handler is still running.
    This is due to a signal firing at just the wrong instant.
    
    Since commit 9d6b0409 ("xprtrdma: Place registered MWs on a
    per-req list"), rpcrdma_mws are self-contained; ie., they fully
    describe an MR and scatterlist, and no part of that information is
    stored in struct rpcrdma_req.
    
    As part of closing the above race window, pass only the req's list
    of registered MRs to ro_unmap_sync, rather than the rpcrdma_req
    itself.
    
    Some extra transport header sanity checking is removed. Since the
    client depends on its own recollection of what memory had been
    registered, there doesn't seem to be a way to abuse this change.
    
    And, the check was not terribly effective. If the client had sent
    Read chunks, the "list_empty" test is negative in both of the
    removed cases, which are actually looking for Write or Reply
    chunks.
    
    BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=305
    Fixes: 68791649 ('xprtrdma: Invalidate in the RPC reply ... ')
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    451d26e1
rpc_rdma.c 34.1 KB