1. 21 10月, 2010 7 次提交
    • J
      nfsd4: make backchannel sequence number per-session · ac7c46f2
      J. Bruce Fields 提交于
      Currently we don't deal well with a client that has multiple sessions
      associated with it (even simultaneously, or serially over the lifetime
      of the client).
      
      In particular, we don't attempt to keep the backchannel running after
      the original session diseappears.
      
      We will fix that soon.
      
      Once we do that, we need the slot sequence number to be per-session;
      otherwise, for example, we cannot correctly handle a case like this:
      
      	- All session 1 connections are lost.
      	- The client creates session 2.  We use it for the backchannel
      	  (since it's the only working choice).
      	- The client gives us a new connection to use with session 1.
      	- The client destroys session 2.
      
      At this point our only choice is to go back to using session 1.  When we
      do so we must use the sequence number that is next for session 1.  We
      therefore need to maintain multiple sequence number streams.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      ac7c46f2
    • J
      nfsd4: use client pointer to backchannel session · 90c8145b
      J. Bruce Fields 提交于
      Instead of copying the sessionid, use the new cl_cb_session pointer,
      which indicates which session we're using for the backchannel.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      90c8145b
    • J
      nfsd4: move callback setup into session init code · edd76786
      J. Bruce Fields 提交于
      The backchannel should  be associated with a session, it isn't really
      global to the client.
      
      We do, however, want a pointer global to the client which tracks which
      session we're currently using for client-based callbacks.
      
      This is a first step in that direction; for now, just reshuffling of
      code with no significant change in behavior.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      edd76786
    • J
      nfsd4: don't cache seq_misordered replies · cd5b8144
      J. Bruce Fields 提交于
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      cd5b8144
    • C
      SUNRPC: Properly initialize sock_xprt.srcaddr in all cases · 92476850
      Chuck Lever 提交于
      The source address field in the transport's sock_xprt is initialized
      ONLY IF the RPC application passed a pointer to a source address
      during the call to rpc_create().  However, xs_bind() subsequently uses
      the value of this field without regard to whether the source address
      was initialized during transport creation or not.
      
      So far we've been lucky: the uninitialized value of this field is
      zeroes.  xs_bind(), until recently, used only the sin[6]_addr field in
      this sockaddr, and all zeroes is a valid value for this: it means
      ANYADDR.  This is a happy coincidence.
      
      However, xs_bind() now wants to use the sa_family field as well, and
      expects it to be initialized to something other than zero.
      
      Therefore, the source address sockaddr field should be fully
      initialized at transport create time in _every_ case, not just when
      the RPC application wants to use a specific bind address.
      
      Bruce added a workaround for this missing initialization by adjusting
      commit 6bc9638a, but the "right" way to do this is to ensure that the
      source address sockaddr is always correctly initialized from the
      get-go.
      
      This patch doesn't introduce a behavior change.  It's simply a
      clean-up of Bruce's fix, to prevent future problems of this kind.  It
      may look like overkill, but
      
        a) it clearly documents the default initial value of this field,
      
        b) it doesn't assume that the sockaddr_storage memory is first
           initialized to any particular value, and
      
        c) it will fail verbosely if some unknown address family is passed
           in
      
      Originally introduced by commit d3bc9a1d.
      Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      92476850
    • C
      SUNRPC: Use conventional switch statement when reclassifying sockets · 4232e863
      Chuck Lever 提交于
      Clean up.
      
      Defensive coding: If "family" is ever something that is neither
      AF_INET nor AF_INET6, xs_reclassify_socket6() is not the appropriate
      default action.  Choose to do nothing in that case.
      
      Introduced by commit 6bc9638a.
      Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      4232e863
    • T
      sunrpc/xprtrdma: clean up workqueue usage · a25e758c
      Tejun Heo 提交于
      * Create and use svc_rdma_wq instead of using the system workqueue and
        flush_scheduled_work().  This workqueue is necessary to serve as
        flushing domain for rdma->sc_work which is used to destroy itself
        and thus can't be flushed explicitly.
      
      * Replace cancel_delayed_work() + flush_scheduled_work() with
        cancel_delayed_work_sync().
      
      * Implement synchronous connect in xprt_rdma_connect() using
        flush_delayed_work() on the rdma_connect work instead of using
        flush_scheduled_work().
      
      This is to prepare for the deprecation and removal of
      flush_scheduled_work().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      a25e758c
  2. 19 10月, 2010 19 次提交
  3. 12 10月, 2010 4 次提交
    • J
      nfsd4: expire clients more promptly · ecec6e34
      J. Bruce Fields 提交于
      Expire clients more promptly, at the expense of possibly running the
      laundromat thread more frequently.
      
      Though it's not the default, I'd like it to be feasible to run with a
      lease time of just a few seconds, at which point a minimum 10 second
      wait between laundromat runs seems a little much.
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      ecec6e34
    • P
    • N
      sunrpc/cache: centralise handling of size limit on deferred list. · e33534d5
      NeilBrown 提交于
      We limit the number of 'defer' requests to DFR_MAX.
      
      The imposition of this limit is spread about a bit - sometime we don't
      add new things to the list, sometimes we remove old things.
      
      Also it is currently applied to requests which we are 'waiting' for
      rather than 'deferring'.  This doesn't seem ideal as 'waiting'
      requests are naturally limited by the number of threads.
      
      So gather the DFR_MAX handling code to one place and only apply it to
      requests that are actually being deferred.
      
      This means that not all 'cache_deferred_req' structures go on the
      'cache_defer_list, so we need to be careful when adding and removing
      things.
      Signed-off-by: NNeilBrown <neilb@suse.de>
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      e33534d5
    • N
      sunrpc: Simplify cache_defer_req and related functions. · d29068c4
      NeilBrown 提交于
      The return value from cache_defer_req is somewhat confusing.
      Various different error codes are returned, but the single caller is
      only interested in success or failure.
      
      In fact it can measure this success or failure itself by checking
      CACHE_PENDING, which makes the point of the code more explicit.
      
      So change cache_defer_req to return 'void' and test CACHE_PENDING
      after it completes, to see if the request was actually deferred or
      not.
      
      Similarly setup_deferral and cache_wait_req don't need a return value,
      so make them void and remove some code.
      
      The call to cache_revisit_request (to guard against a race) is only
      needed for the second call to setup_deferral, so move it out of
      setup_deferral to after that second call.  With the first call the
      race is handled differently (by explicitly calling
      'wait_for_completion').
      Signed-off-by: NNeilBrown <neilb@suse.de>
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      d29068c4
  4. 03 10月, 2010 1 次提交
    • J
      nfsd4: return expired on unfound stateid's · 33515142
      J. Bruce Fields 提交于
      Commit 78155ed7 "nfsd4: distinguish
      expired from stale stateids" attempted to distinguish expired and stale
      stateid's using time information that may not have been completely
      reliable, so I reverted it.
      
      That was throwing out the baby with the bathwater; we still do want to
      return expired, but let's do that using the simpler approach of just
      assuming any stateid is expired if it looks like it was given out by the
      current server instance, but we can't find it any more.
      
      This may help clients that are recovering from network partitions.
      Reported-by: NBian Naimeng <biannm@cn.fujitsu.com>
      Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
      33515142
  5. 02 10月, 2010 9 次提交