aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4proc.c
diff options
context:
space:
mode:
authorAndy Adamson <andros@netapp.com>2009-04-03 01:28:45 -0400
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-04-03 20:41:19 -0400
commit6668958fac1d05f55420de702f3678d46c1e93a5 (patch)
tree2ee7fe01bb6720ecb1147c5c7f7e3d0289fc71bb /fs/nfsd/nfs4proc.c
parentdd453dfd70538cadc02cb47ff8d8cfd0cb8cf435 (diff)
nfsd41: stateid handling
When sessions are used, stateful operation sequenceid and stateid handling are not used. When sessions are used, on the first open set the seqid to 1, mark state confirmed and skip seqid processing. When sessionas are used the stateid generation number is ignored when it is zero whereas without sessions bad_stateid or stale stateid is returned. Add flags to propagate session use to all stateful ops and down to check_stateid_generation. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: Andy Adamson <andros@netapp.com> [nfsd4_has_session should return a boolean, not u32] Signed-off-by: Benny Halevy <bhalevy@panasas.com> [nfsd41: pass nfsd4_compoundres * to nfsd4_process_open1] [nfsd41: calculate HAS_SESSION in nfs4_preprocess_stateid_op] [nfsd41: calculate HAS_SESSION in nfs4_preprocess_seqid_op] Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd/nfs4proc.c')
-rw-r--r--fs/nfsd/nfs4proc.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index e6a0f314fdbe..aeb4888bdfad 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -168,6 +168,8 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
168 struct nfsd4_open *open) 168 struct nfsd4_open *open)
169{ 169{
170 __be32 status; 170 __be32 status;
171 struct nfsd4_compoundres *resp;
172
171 dprintk("NFSD: nfsd4_open filename %.*s op_stateowner %p\n", 173 dprintk("NFSD: nfsd4_open filename %.*s op_stateowner %p\n",
172 (int)open->op_fname.len, open->op_fname.data, 174 (int)open->op_fname.len, open->op_fname.data,
173 open->op_stateowner); 175 open->op_stateowner);
@@ -179,7 +181,8 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
179 nfs4_lock_state(); 181 nfs4_lock_state();
180 182
181 /* check seqid for replay. set nfs4_owner */ 183 /* check seqid for replay. set nfs4_owner */
182 status = nfsd4_process_open1(open); 184 resp = rqstp->rq_resp;
185 status = nfsd4_process_open1(&resp->cstate, open);
183 if (status == nfserr_replay_me) { 186 if (status == nfserr_replay_me) {
184 struct nfs4_replay *rp = &open->op_stateowner->so_replay; 187 struct nfs4_replay *rp = &open->op_stateowner->so_replay;
185 fh_put(&cstate->current_fh); 188 fh_put(&cstate->current_fh);