• Chuck Lever's avatar
    SUNRPC: Fix large reads on NFS/RDMA · 2b7bbc96
    Chuck Lever authored
    After commit a11a2bf4, "SUNRPC: Optimise away unnecessary data moves
    in xdr_align_pages", Thu Aug 2 13:21:43 2012, READs larger than a
    few hundred bytes via NFS/RDMA no longer work.  This commit exposed
    a long-standing bug in rpcrdma_inline_fixup().
    
    I reproduce this with an rsize=4096 mount using the cthon04 basic
    tests.  Test 5 fails with an EIO error.
    
    For my reproducer, kernel log shows:
    
      NFS: server cheating in read reply: count 4096 > recvd 0
    
    rpcrdma_inline_fixup() is zeroing the xdr_stream::page_len field,
    and xdr_align_pages() is now returning that value to the READ XDR
    decoder function.
    
    That field is set up by xdr_inline_pages() by the READ XDR encoder
    function.  As far as I can tell, it is supposed to be left alone
    after that, as it describes the dimensions of the reply xdr_stream,
    not the contents of that stream.
    
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=68391Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    2b7bbc96
rpc_rdma.c 27.6 KB