• Chuck Lever's avatar
    xprtrdma: Fix XDR tail buffer marshalling · 677eb17e
    Chuck Lever authored
    Currently xprtrdma appends an extra chunk element to the RPC/RDMA
    read chunk list of each NFSv4 WRITE compound. The extra element
    contains the final GETATTR operation in the compound.
    
    The result is an extra RDMA READ operation to transfer a very short
    piece of each NFS WRITE compound (typically 16 bytes). This is
    inefficient.
    
    It is also incorrect.
    
    The client is sending the trailing GETATTR at the same Position as
    the preceding WRITE data payload. Whether or not RFC 5667 allows
    the GETATTR to appear in a read chunk, RFC 5666 requires that these
    two separate RPC arguments appear at two distinct Positions.
    
    It can also be argued that the GETATTR operation is not bulk data,
    and therefore RFC 5667 forbids its appearance in a read chunk at
    all.
    
    Although RFC 5667 is not precise about when using a read list with
    NFSv4 COMPOUND is allowed, the intent is that only data arguments
    not touched by NFS (ie, read and write payloads) are to be sent
    using RDMA READ or WRITE.
    
    The NFS client constructs GETATTR arguments itself, and therefore is
    required to send the trailing GETATTR operation as additional inline
    content, not as a data payload.
    
    NB: This change is not backwards compatible. Some older servers do
    not accept inline content following the read list. The Linux NFS
    server should handle this content correctly as of commit
    a97c331f ("svcrdma: Handle additional inline content").
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Tested-by: default avatarDevesh Sharma <devesh.sharma@avagotech.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    677eb17e
rpc_rdma.c 26.8 KB