diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r-- | fs/nfsd/nfs4state.c | 31 |
1 files changed, 9 insertions, 22 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 578ea521c827..3510e2ca40d2 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -1178,7 +1178,6 @@ release_stateid(struct nfs4_stateid *stp, int flags) | |||
1178 | locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner); | 1178 | locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner); |
1179 | put_nfs4_file(stp->st_file); | 1179 | put_nfs4_file(stp->st_file); |
1180 | kmem_cache_free(stateid_slab, stp); | 1180 | kmem_cache_free(stateid_slab, stp); |
1181 | stp = NULL; | ||
1182 | } | 1181 | } |
1183 | 1182 | ||
1184 | static void | 1183 | static void |
@@ -1191,22 +1190,6 @@ move_to_close_lru(struct nfs4_stateowner *sop) | |||
1191 | sop->so_time = get_seconds(); | 1190 | sop->so_time = get_seconds(); |
1192 | } | 1191 | } |
1193 | 1192 | ||
1194 | static void | ||
1195 | release_state_owner(struct nfs4_stateid *stp, int flag) | ||
1196 | { | ||
1197 | struct nfs4_stateowner *sop = stp->st_stateowner; | ||
1198 | |||
1199 | dprintk("NFSD: release_state_owner\n"); | ||
1200 | release_stateid(stp, flag); | ||
1201 | |||
1202 | /* place unused nfs4_stateowners on so_close_lru list to be | ||
1203 | * released by the laundromat service after the lease period | ||
1204 | * to enable us to handle CLOSE replay | ||
1205 | */ | ||
1206 | if (sop->so_confirmed && list_empty(&sop->so_stateids)) | ||
1207 | move_to_close_lru(sop); | ||
1208 | } | ||
1209 | |||
1210 | static int | 1193 | static int |
1211 | cmp_owner_str(struct nfs4_stateowner *sop, struct xdr_netobj *owner, clientid_t *clid) { | 1194 | cmp_owner_str(struct nfs4_stateowner *sop, struct xdr_netobj *owner, clientid_t *clid) { |
1212 | return ((sop->so_owner.len == owner->len) && | 1195 | return ((sop->so_owner.len == owner->len) && |
@@ -2423,15 +2406,19 @@ nfsd4_close(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_clos | |||
2423 | CHECK_FH | OPEN_STATE | CLOSE_STATE, | 2406 | CHECK_FH | OPEN_STATE | CLOSE_STATE, |
2424 | &close->cl_stateowner, &stp, NULL))) | 2407 | &close->cl_stateowner, &stp, NULL))) |
2425 | goto out; | 2408 | goto out; |
2426 | /* | ||
2427 | * Return success, but first update the stateid. | ||
2428 | */ | ||
2429 | status = nfs_ok; | 2409 | status = nfs_ok; |
2430 | update_stateid(&stp->st_stateid); | 2410 | update_stateid(&stp->st_stateid); |
2431 | memcpy(&close->cl_stateid, &stp->st_stateid, sizeof(stateid_t)); | 2411 | memcpy(&close->cl_stateid, &stp->st_stateid, sizeof(stateid_t)); |
2432 | 2412 | ||
2433 | /* release_state_owner() calls nfsd_close() if needed */ | 2413 | /* release_stateid() calls nfsd_close() if needed */ |
2434 | release_state_owner(stp, OPEN_STATE); | 2414 | release_stateid(stp, OPEN_STATE); |
2415 | |||
2416 | /* place unused nfs4_stateowners on so_close_lru list to be | ||
2417 | * released by the laundromat service after the lease period | ||
2418 | * to enable us to handle CLOSE replay | ||
2419 | */ | ||
2420 | if (list_empty(&close->cl_stateowner->so_stateids)) | ||
2421 | move_to_close_lru(close->cl_stateowner); | ||
2435 | out: | 2422 | out: |
2436 | if (close->cl_stateowner) { | 2423 | if (close->cl_stateowner) { |
2437 | nfs4_get_stateowner(close->cl_stateowner); | 2424 | nfs4_get_stateowner(close->cl_stateowner); |