nfsd: extra checks when freeing delegation stateids
authorJeff Layton <jlayton@kernel.org>
Mon, 26 Sep 2022 18:41:02 +0000 (14:41 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 26 Sep 2022 18:50:58 +0000 (14:50 -0400)
We've had some reports of problems in the refcounting for delegation
stateids that we've yet to track down. Add some extra checks to ensure
that we've removed the object from various lists before freeing it.

Link: https://bugzilla.redhat.com/show_bug.cgi?id=2127067
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4state.c

index c78c3223161eed9df298e27e28d96634f26ee674..198d7abf34e45151a08378518a3abe38e7937b65 100644 (file)
@@ -1060,7 +1060,12 @@ static struct nfs4_ol_stateid * nfs4_alloc_open_stateid(struct nfs4_client *clp)
 
 static void nfs4_free_deleg(struct nfs4_stid *stid)
 {
-       WARN_ON(!list_empty(&stid->sc_cp_list));
+       struct nfs4_delegation *dp = delegstateid(stid);
+
+       WARN_ON_ONCE(!list_empty(&stid->sc_cp_list));
+       WARN_ON_ONCE(!list_empty(&dp->dl_perfile));
+       WARN_ON_ONCE(!list_empty(&dp->dl_perclnt));
+       WARN_ON_ONCE(!list_empty(&dp->dl_recall_lru));
        kmem_cache_free(deleg_slab, stid);
        atomic_long_dec(&num_delegations);
 }