|
@@ -119,7 +119,6 @@ opaque_hashval(const void *ptr, int nbytes)
|
|
|
|
|
|
/* forward declarations */
|
|
|
static void release_stateowner(struct nfs4_stateowner *sop);
|
|
|
-static void release_stateid(struct nfs4_stateid *stp, int flags);
|
|
|
|
|
|
/*
|
|
|
* Delegation state
|
|
@@ -311,6 +310,34 @@ static struct list_head unconf_id_hashtbl[CLIENT_HASH_SIZE];
|
|
|
static struct list_head client_lru;
|
|
|
static struct list_head close_lru;
|
|
|
|
|
|
+static void unhash_generic_stateid(struct nfs4_stateid *stp)
|
|
|
+{
|
|
|
+ list_del(&stp->st_hash);
|
|
|
+ list_del(&stp->st_perfile);
|
|
|
+ list_del(&stp->st_perstateowner);
|
|
|
+}
|
|
|
+
|
|
|
+static void free_generic_stateid(struct nfs4_stateid *stp)
|
|
|
+{
|
|
|
+ put_nfs4_file(stp->st_file);
|
|
|
+ kmem_cache_free(stateid_slab, stp);
|
|
|
+}
|
|
|
+
|
|
|
+static void release_lock_stateid(struct nfs4_stateid *stp)
|
|
|
+{
|
|
|
+ unhash_generic_stateid(stp);
|
|
|
+ locks_remove_posix(stp->st_vfs_file, (fl_owner_t)stp->st_stateowner);
|
|
|
+ free_generic_stateid(stp);
|
|
|
+}
|
|
|
+
|
|
|
+static void release_open_stateid(struct nfs4_stateid *stp)
|
|
|
+{
|
|
|
+ unhash_generic_stateid(stp);
|
|
|
+ release_stateid_lockowners(stp);
|
|
|
+ nfsd_close(stp->st_vfs_file);
|
|
|
+ free_generic_stateid(stp);
|
|
|
+}
|
|
|
+
|
|
|
static inline void
|
|
|
renew_client(struct nfs4_client *clp)
|
|
|
{
|
|
@@ -1065,9 +1092,9 @@ unhash_stateowner(struct nfs4_stateowner *sop)
|
|
|
stp = list_entry(sop->so_stateids.next,
|
|
|
struct nfs4_stateid, st_perstateowner);
|
|
|
if (sop->so_is_open_owner)
|
|
|
- release_stateid(stp, OPEN_STATE);
|
|
|
+ release_open_stateid(stp);
|
|
|
else
|
|
|
- release_stateid(stp, LOCK_STATE);
|
|
|
+ release_lock_stateid(stp);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1105,24 +1132,6 @@ init_stateid(struct nfs4_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *
|
|
|
stp->st_openstp = NULL;
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-release_stateid(struct nfs4_stateid *stp, int flags)
|
|
|
-{
|
|
|
- struct file *filp = stp->st_vfs_file;
|
|
|
-
|
|
|
- list_del(&stp->st_hash);
|
|
|
- list_del(&stp->st_perfile);
|
|
|
- list_del(&stp->st_perstateowner);
|
|
|
- if (flags & OPEN_STATE) {
|
|
|
- release_stateid_lockowners(stp);
|
|
|
- stp->st_vfs_file = NULL;
|
|
|
- nfsd_close(filp);
|
|
|
- } else if (flags & LOCK_STATE)
|
|
|
- locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner);
|
|
|
- put_nfs4_file(stp->st_file);
|
|
|
- kmem_cache_free(stateid_slab, stp);
|
|
|
-}
|
|
|
-
|
|
|
static void
|
|
|
move_to_close_lru(struct nfs4_stateowner *sop)
|
|
|
{
|
|
@@ -1764,7 +1773,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
|
|
|
init_stateid(stp, fp, open);
|
|
|
status = nfsd4_truncate(rqstp, current_fh, open);
|
|
|
if (status) {
|
|
|
- release_stateid(stp, OPEN_STATE);
|
|
|
+ release_open_stateid(stp);
|
|
|
goto out;
|
|
|
}
|
|
|
}
|
|
@@ -2373,7 +2382,7 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
|
memcpy(&close->cl_stateid, &stp->st_stateid, sizeof(stateid_t));
|
|
|
|
|
|
/* release_stateid() calls nfsd_close() if needed */
|
|
|
- release_stateid(stp, OPEN_STATE);
|
|
|
+ release_open_stateid(stp);
|
|
|
|
|
|
/* place unused nfs4_stateowners on so_close_lru list to be
|
|
|
* released by the laundromat service after the lease period
|