nfsd4: look up stateid's per clientid
Use a separate stateid idr per client, and lookup a stateid by first finding the client, then looking up the stateid relative to that client. Also some minor refactoring. This allows us to improve error returns: we can return expired when the clientid is not found and bad_stateid when the clientid is found but not the stateid, as opposed to returning expired for both cases. I hope this will also help to replace the state lock mostly by a per-client lock, but that hasn't been done yet. Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
36279ac10c
commit
38c2f4b12a
3 changed files with 54 additions and 65 deletions
|
@ -35,6 +35,7 @@
|
|||
#ifndef _NFSD4_STATE_H
|
||||
#define _NFSD4_STATE_H
|
||||
|
||||
#include <linux/idr.h>
|
||||
#include <linux/sunrpc/svc_xprt.h>
|
||||
#include <linux/nfsd/nfsfh.h>
|
||||
#include "nfsfh.h"
|
||||
|
@ -231,6 +232,7 @@ struct nfs4_client {
|
|||
struct list_head cl_idhash; /* hash by cl_clientid.id */
|
||||
struct list_head cl_strhash; /* hash by cl_name */
|
||||
struct list_head cl_openowners;
|
||||
struct idr cl_stateids; /* stateid lookup */
|
||||
struct list_head cl_delegations;
|
||||
struct list_head cl_lru; /* tail queue */
|
||||
struct xdr_netobj cl_name; /* id generated by client */
|
||||
|
@ -508,7 +510,7 @@ extern void nfsd4_recdir_purge_old(void);
|
|||
extern int nfsd4_create_clid_dir(struct nfs4_client *clp);
|
||||
extern void nfsd4_remove_clid_dir(struct nfs4_client *clp);
|
||||
extern void release_session_client(struct nfsd4_session *);
|
||||
extern __be32 nfs4_validate_stateid(stateid_t *);
|
||||
extern __be32 nfs4_validate_stateid(struct nfs4_client *, stateid_t *);
|
||||
extern void nfsd4_purge_closed_stateid(struct nfs4_stateowner *);
|
||||
|
||||
#endif /* NFSD4_STATE_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue