aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2010-10-02 18:42:39 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-10-02 18:49:33 -0400
commit33515142156efc9ab5dbfe93ff8d4765559dc987 (patch)
tree64dc7ef93b822a703d5ffe32aeb8007550d1daa5 /fs
parent328ead287220711c3ad4490b1f3f691855df4039 (diff)
nfsd4: return expired on unfound stateid's
Commit 78155ed75f470710f2aecb3e75e3d97107ba8374 "nfsd4: distinguish expired from stale stateids" attempted to distinguish expired and stale stateid's using time information that may not have been completely reliable, so I reverted it. That was throwing out the baby with the bathwater; we still do want to return expired, but let's do that using the simpler approach of just assuming any stateid is expired if it looks like it was given out by the current server instance, but we can't find it any more. This may help clients that are recovering from network partitions. Reported-by: Bian Naimeng <biannm@cn.fujitsu.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4state.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 596702e157c9..02c23b7c5cd5 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3046,7 +3046,11 @@ nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
3046 if (STALE_STATEID(stateid)) 3046 if (STALE_STATEID(stateid))
3047 goto out; 3047 goto out;
3048 3048
3049 status = nfserr_bad_stateid; 3049 /*
3050 * We assume that any stateid that has the current boot time,
3051 * but that we can't find, is expired:
3052 */
3053 status = nfserr_expired;
3050 if (is_delegation_stateid(stateid)) { 3054 if (is_delegation_stateid(stateid)) {
3051 dp = find_delegation_stateid(ino, stateid); 3055 dp = find_delegation_stateid(ino, stateid);
3052 if (!dp) 3056 if (!dp)
@@ -3066,6 +3070,7 @@ nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
3066 stp = find_stateid(stateid, flags); 3070 stp = find_stateid(stateid, flags);
3067 if (!stp) 3071 if (!stp)
3068 goto out; 3072 goto out;
3073 status = nfserr_bad_stateid;
3069 if (nfs4_check_fh(current_fh, stp)) 3074 if (nfs4_check_fh(current_fh, stp))
3070 goto out; 3075 goto out;
3071 if (!stp->st_stateowner->so_confirmed) 3076 if (!stp->st_stateowner->so_confirmed)
@@ -3140,8 +3145,9 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
3140 * a replayed close: 3145 * a replayed close:
3141 */ 3146 */
3142 sop = search_close_lru(stateid->si_stateownerid, flags); 3147 sop = search_close_lru(stateid->si_stateownerid, flags);
3148 /* It's not stale; let's assume it's expired: */
3143 if (sop == NULL) 3149 if (sop == NULL)
3144 return nfserr_bad_stateid; 3150 return nfserr_expired;
3145 *sopp = sop; 3151 *sopp = sop;
3146 goto check_replay; 3152 goto check_replay;
3147 } 3153 }
@@ -3406,6 +3412,7 @@ nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3406 status = nfserr_bad_stateid; 3412 status = nfserr_bad_stateid;
3407 if (!is_delegation_stateid(stateid)) 3413 if (!is_delegation_stateid(stateid))
3408 goto out; 3414 goto out;
3415 status = nfserr_expired;
3409 dp = find_delegation_stateid(inode, stateid); 3416 dp = find_delegation_stateid(inode, stateid);
3410 if (!dp) 3417 if (!dp)
3411 goto out; 3418 goto out;