diff options
author | Andy Adamson <andros@netapp.com> | 2009-04-03 01:28:45 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-04-03 20:41:19 -0400 |
commit | 6668958fac1d05f55420de702f3678d46c1e93a5 (patch) | |
tree | 2ee7fe01bb6720ecb1147c5c7f7e3d0289fc71bb /fs/nfsd/nfs4proc.c | |
parent | dd453dfd70538cadc02cb47ff8d8cfd0cb8cf435 (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.c | 5 |
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); |