nfsd: Fix memory leak of so_owner.data in nfs4_stateowner
authorKinglong Mee <kinglongmee@gmail.com>
Thu, 16 Jul 2015 04:05:07 +0000 (12:05 +0800)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 10 Aug 2015 20:05:46 +0000 (16:05 -0400)
v2, new helper nfs4_free_stateowner for freeing so_owner.data and sop

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index c7000c3..5018b6e 100644 (file)
@@ -990,6 +990,12 @@ release_all_access(struct nfs4_ol_stateid *stp)
        }
 }
 
+static inline void nfs4_free_stateowner(struct nfs4_stateowner *sop)
+{
+       kfree(sop->so_owner.data);
+       sop->so_ops->so_free(sop);
+}
+
 static void nfs4_put_stateowner(struct nfs4_stateowner *sop)
 {
        struct nfs4_client *clp = sop->so_client;
@@ -1000,8 +1006,7 @@ static void nfs4_put_stateowner(struct nfs4_stateowner *sop)
                return;
        sop->so_ops->so_unhash(sop);
        spin_unlock(&clp->cl_lock);
-       kfree(sop->so_owner.data);
-       sop->so_ops->so_free(sop);
+       nfs4_free_stateowner(sop);
 }
 
 static void unhash_ol_stateid(struct nfs4_ol_stateid *stp)
@@ -3318,7 +3323,8 @@ alloc_init_open_stateowner(unsigned int strhashval, struct nfsd4_open *open,
                hash_openowner(oo, clp, strhashval);
                ret = oo;
        } else
-               nfs4_free_openowner(&oo->oo_owner);
+               nfs4_free_stateowner(&oo->oo_owner);
+
        spin_unlock(&clp->cl_lock);
        return ret;
 }
@@ -5219,7 +5225,8 @@ alloc_init_lock_stateowner(unsigned int strhashval, struct nfs4_client *clp,
                         &clp->cl_ownerstr_hashtbl[strhashval]);
                ret = lo;
        } else
-               nfs4_free_lockowner(&lo->lo_owner);
+               nfs4_free_stateowner(&lo->lo_owner);
+
        spin_unlock(&clp->cl_lock);
        return ret;
 }