1. 19 Apr, 2008 5 commits
    • Trond Myklebust's avatar
      NFS: Ensure that the read code cleans up properly when rpc_run_task() fails · fdd1e74c
      Trond Myklebust authored
      In the case of readpage() we need to ensure that the pages get unlocked,
      and that the error is flagged.
      
      In the case of O_DIRECT, we need to ensure that the pages are all released.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      fdd1e74c
    • Trond Myklebust's avatar
      NFS: Fix nfs_wb_page() to always exit with an error or a clean page · 73e3302f
      Trond Myklebust authored
      It is possible for nfs_wb_page() to sometimes exit with 0 return value, yet
      the page is left in a dirty state.
      For instance in the case where the server rebooted, and the COMMIT request
      failed, then all the previously "clean" pages which were cached by the
      server, but were not guaranteed to have been writted out to disk,
      have to be redirtied and resent to the server.
      The fix is to have nfs_wb_page_priority() check that the page is clean
      before it exits...
      
      This fixes a condition that triggers the BUG_ON(PagePrivate(page)) in
      nfs_create_request() when we're in the nfs_readpage() path.
      
      Also eliminate a redundant BUG_ON(!PageLocked(page)) while we're at it. It
      turns out that clear_page_dirty_for_io() has the exact same test.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      73e3302f
    • Trond Myklebust's avatar
      SUNRPC: Don't attempt to destroy expired RPCSEC_GSS credentials.. · 080a1f14
      Trond Myklebust authored
      ..and always destroy using a 'soft' RPC call. Destroying GSS credentials
      isn't mandatory; the server can always cope with a few credentials not
      getting destroyed in a timely fashion.
      
      This actually fixes a hang situation. Basically, some servers will decide
      that the client is crazy if it tries to destroy an RPC context for which
      they have sent an RPCSEC_GSS_CREDPROBLEM, and so will refuse to talk to it
      for a while.
      The regression therefor probably was introduced by commit
      0df7fb74.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      080a1f14
    • Trond Myklebust's avatar
      SUNRPC: Fix up xprt_write_space() · b6ddf64f
      Trond Myklebust authored
      The rest of the networking layer uses SOCK_ASYNC_NOSPACE to signal whether
      or not we have someone waiting for buffer memory. Convert the SUNRPC layer
      to use the same idiom.
      Remove the unlikely()s in xs_udp_write_space and xs_tcp_write_space. In
      fact, the most common case will be that there is nobody waiting for buffer
      space.
      
      SOCK_NOSPACE is there to tell the TCP layer whether or not the cwnd was
      limited by the application window. Ensure that we follow the same idiom as
      the rest of the networking layer here too.
      
      Finally, ensure that we clear SOCK_ASYNC_NOSPACE once we wake up, so that
      write_space() doesn't keep waking things up on xprt->pending.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      b6ddf64f
    • Trond Myklebust's avatar
      SUNRPC: Fix a bug in call_decode() · 24b74bf0
      Trond Myklebust authored
      call_verify() can, under certain circumstances, free the RPC slot. In that
      case, our cached pointer 'req = task->tk_rqstp' is invalid. Bug was
      introduced in commit 220bcc2a (SUNRPC:
      Don't call xprt_release in call refresh).
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      24b74bf0
  2. 19 Mar, 2008 35 commits