diff options
author | Jeff Layton <jlayton@primarydata.com> | 2014-07-29 21:34:27 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2014-07-31 14:20:19 -0400 |
commit | 58fb12e6a42f30adf209f8f41385a3bbb2c82420 (patch) | |
tree | 5ca75f92bd5aa9629f30c21d6e0e8df8f0984235 /fs/nfsd/xdr4.h | |
parent | 6b180f0b57af0295e8dc2602a7a4781241766340 (diff) |
nfsd: Add a mutex to protect the NFSv4.0 open owner replay cache
We don't want to rely on the client_mutex for protection in the case of
NFSv4 open owners. Instead, we add a mutex that will only be taken for
NFSv4.0 state mutating operations, and that will be released once the
entire compound is done.
Also, ensure that nfsd4_cstate_assign_replay/nfsd4_cstate_clear_replay
take a reference to the stateowner when they are using it for NFSv4.0
open and lock replay caching.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Jeff Layton <jlayton@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/xdr4.h')
-rw-r--r-- | fs/nfsd/xdr4.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h index 5abf6c942ddf..465e7799742a 100644 --- a/fs/nfsd/xdr4.h +++ b/fs/nfsd/xdr4.h | |||
@@ -599,7 +599,9 @@ extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *, | |||
599 | struct nfsd4_open *open, struct nfsd_net *nn); | 599 | struct nfsd4_open *open, struct nfsd_net *nn); |
600 | extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp, | 600 | extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp, |
601 | struct svc_fh *current_fh, struct nfsd4_open *open); | 601 | struct svc_fh *current_fh, struct nfsd4_open *open); |
602 | extern void nfsd4_cleanup_open_state(struct nfsd4_open *open, __be32 status); | 602 | extern void nfsd4_cstate_clear_replay(struct nfsd4_compound_state *cstate); |
603 | extern void nfsd4_cleanup_open_state(struct nfsd4_compound_state *cstate, | ||
604 | struct nfsd4_open *open, __be32 status); | ||
603 | extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp, | 605 | extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp, |
604 | struct nfsd4_compound_state *, struct nfsd4_open_confirm *oc); | 606 | struct nfsd4_compound_state *, struct nfsd4_open_confirm *oc); |
605 | extern __be32 nfsd4_close(struct svc_rqst *rqstp, | 607 | extern __be32 nfsd4_close(struct svc_rqst *rqstp, |
@@ -630,6 +632,7 @@ extern __be32 nfsd4_test_stateid(struct svc_rqst *rqstp, | |||
630 | extern __be32 nfsd4_free_stateid(struct svc_rqst *rqstp, | 632 | extern __be32 nfsd4_free_stateid(struct svc_rqst *rqstp, |
631 | struct nfsd4_compound_state *, struct nfsd4_free_stateid *free_stateid); | 633 | struct nfsd4_compound_state *, struct nfsd4_free_stateid *free_stateid); |
632 | extern void nfsd4_bump_seqid(struct nfsd4_compound_state *, __be32 nfserr); | 634 | extern void nfsd4_bump_seqid(struct nfsd4_compound_state *, __be32 nfserr); |
635 | |||
633 | #endif | 636 | #endif |
634 | 637 | ||
635 | /* | 638 | /* |