@@ -877,6 +877,18 @@ static void nfs4_free_generic_stateid(struct nfs4_stid *stid)
nfs4_free_stid(stateid_slab, stid);
}
+static void nfs4_free_lock_stateid(struct nfs4_stid *stid)
+{
+ struct nfs4_ol_stateid *stp = openlockstateid(stid);
+ struct nfs4_lockowner *lo = lockowner(stp->st_stateowner);
+ struct file *file;
+
+ file = find_any_file(stp->st_stid.sc_file);
+ if (file)
+ filp_close(file, (fl_owner_t)lo);
+ nfs4_free_generic_stateid(stid);
+}
+
static void put_generic_stateid(struct nfs4_ol_stateid *stp)
{
nfs4_put_stid(&stp->st_stid);
@@ -884,14 +896,9 @@ static void put_generic_stateid(struct nfs4_ol_stateid *stp)
static void __release_lock_stateid(struct nfs4_ol_stateid *stp)
{
- struct file *file;
-
list_del(&stp->st_locks);
unhash_generic_stateid(stp);
unhash_stid(&stp->st_stid);
- file = find_any_file(stp->st_stid.sc_file);
- if (file)
- filp_close(file, (fl_owner_t)lockowner(stp->st_stateowner));
put_generic_stateid(stp);
}
@@ -4645,6 +4652,7 @@ alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp, struct
stp->st_stateowner = &lo->lo_owner;
get_nfs4_file(fp);
stp->st_stid.sc_file = fp;
+ stp->st_stid.sc_free = nfs4_free_lock_stateid;
stp->st_access_bmap = 0;
stp->st_deny_bmap = open_stp->st_deny_bmap;
stp->st_openstp = open_stp;
Releasing locks when we unhash the stateid instead of doing so only when the stateid is actually released is problematic and will complicate some later changes. Signed-off-by: Jeff Layton <jlayton@primarydata.com> --- fs/nfsd/nfs4state.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)