• A
    nfsd41: Use separate DRC for setclientid · 49557cc7
    Andy Adamson 提交于
    Instead of trying to share the generic 4.1 reply cache code for the
    CREATE_SESSION reply cache, it's simpler to handle CREATE_SESSION
    separately.
    
    The nfs41 single slot clientid DRC holds the results of create session
    processing.  CREATE_SESSION can be preceeded by a SEQUENCE operation
    (an embedded CREATE_SESSION) and the create session single slot cache must be
    maintained.  nfsd4_replay_cache_entry() and nfsd4_store_cache_entry() do not
    implement the replay of an embedded CREATE_SESSION.
    
    The clientid DRC slot does not need the inuse, cachethis or other fields that
    the multiple slot session cache uses.  Replace the clientid DRC cache struct
    nfs4_slot cache with a new nfsd4_clid_slot cache.  Save the xdr struct
    nfsd4_create_session into the cache at the end of processing, and on a replay,
    replace the struct for the replay request with the cached version all while
    under the state lock.
    
    nfsd4_proc_compound will handle both the solo and embedded CREATE_SESSION case
    via the normal use of encode_operation.
    
    Errors that do not change the create session cache:
    A create session NFS4ERR_STALE_CLIENTID error means that a client record
    (and associated create session slot) could not be found and therefore can't
    be changed.  NFSERR_SEQ_MISORDERED errors do not change the slot cache.
    
    All other errors get cached.
    
    Remove the clientid DRC specific check in nfs4svc_encode_compoundres to
    put the session only if cstate.session is set which will now always be true.
    Signed-off-by: NAndy Adamson <andros@netapp.com>
    Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
    49557cc7
nfs4state.c 109.9 KB