diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r-- | fs/nfsd/nfs4state.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index f0eccc236a0d..aa088bc3b169 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -1068,21 +1068,29 @@ same_stateid(stateid_t *id_one, stateid_t *id_two) | |||
1068 | return id_one->si_fileid == id_two->si_fileid; | 1068 | return id_one->si_fileid == id_two->si_fileid; |
1069 | } | 1069 | } |
1070 | 1070 | ||
1071 | static struct nfs4_stateid *find_stateid(stateid_t *t, int flags) | 1071 | static struct nfs4_stateid *find_stateid(stateid_t *t) |
1072 | { | 1072 | { |
1073 | struct nfs4_stateid *s; | 1073 | struct nfs4_stateid *s; |
1074 | unsigned int hashval; | 1074 | unsigned int hashval; |
1075 | 1075 | ||
1076 | hashval = stateid_hashval(t->si_stateownerid, t->si_fileid); | 1076 | hashval = stateid_hashval(t->si_stateownerid, t->si_fileid); |
1077 | list_for_each_entry(s, &stateid_hashtbl[hashval], st_hash) { | 1077 | list_for_each_entry(s, &stateid_hashtbl[hashval], st_hash) |
1078 | if (!same_stateid(&s->st_stateid, t)) | 1078 | if (same_stateid(&s->st_stateid, t)) |
1079 | continue; | 1079 | return s; |
1080 | if (flags & LOCK_STATE && s->st_type != NFS4_LOCK_STID) | 1080 | return NULL; |
1081 | return NULL; | 1081 | } |
1082 | if (flags & OPEN_STATE && s->st_type != NFS4_OPEN_STID) | 1082 | |
1083 | return NULL; | 1083 | static struct nfs4_stateid *find_stateid_by_type(stateid_t *t, int flags) |
1084 | { | ||
1085 | struct nfs4_stateid *s; | ||
1086 | |||
1087 | s = find_stateid(t); | ||
1088 | if (!s) | ||
1089 | return NULL; | ||
1090 | if (flags & LOCK_STATE && s->st_type == NFS4_LOCK_STID) | ||
1091 | return s; | ||
1092 | if (flags & OPEN_STATE && s->st_type == NFS4_OPEN_STID) | ||
1084 | return s; | 1093 | return s; |
1085 | } | ||
1086 | return NULL; | 1094 | return NULL; |
1087 | } | 1095 | } |
1088 | 1096 | ||
@@ -3241,7 +3249,7 @@ __be32 nfs4_validate_stateid(stateid_t *stateid, bool has_session) | |||
3241 | goto out; | 3249 | goto out; |
3242 | 3250 | ||
3243 | status = nfserr_expired; | 3251 | status = nfserr_expired; |
3244 | stp = find_stateid(stateid, 0); | 3252 | stp = find_stateid(stateid); |
3245 | if (!stp) | 3253 | if (!stp) |
3246 | goto out; | 3254 | goto out; |
3247 | status = nfserr_bad_stateid; | 3255 | status = nfserr_bad_stateid; |
@@ -3306,7 +3314,7 @@ nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, | |||
3306 | BUG_ON(!*filpp); | 3314 | BUG_ON(!*filpp); |
3307 | } | 3315 | } |
3308 | } else { /* open or lock stateid */ | 3316 | } else { /* open or lock stateid */ |
3309 | stp = find_stateid(stateid, flags); | 3317 | stp = find_stateid(stateid); |
3310 | if (!stp) | 3318 | if (!stp) |
3311 | goto out; | 3319 | goto out; |
3312 | status = nfserr_bad_stateid; | 3320 | status = nfserr_bad_stateid; |
@@ -3381,7 +3389,7 @@ nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
3381 | goto out; | 3389 | goto out; |
3382 | } | 3390 | } |
3383 | 3391 | ||
3384 | stp = find_stateid(stateid, 0); | 3392 | stp = find_stateid(stateid); |
3385 | if (!stp) { | 3393 | if (!stp) { |
3386 | ret = nfserr_bad_stateid; | 3394 | ret = nfserr_bad_stateid; |
3387 | goto out; | 3395 | goto out; |
@@ -3440,7 +3448,7 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid, | |||
3440 | * the confirmed flag is incorrecly set, or the generation | 3448 | * the confirmed flag is incorrecly set, or the generation |
3441 | * number is incorrect. | 3449 | * number is incorrect. |
3442 | */ | 3450 | */ |
3443 | *stpp = find_stateid(stateid, flags); | 3451 | *stpp = find_stateid_by_type(stateid, flags); |
3444 | if (*stpp == NULL) | 3452 | if (*stpp == NULL) |
3445 | return nfserr_expired; | 3453 | return nfserr_expired; |
3446 | 3454 | ||