]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: use correct loop termination in nfsd4_revoke_states()
authorNeilBrown <neil@brown.name>
Sun, 14 Dec 2025 21:07:28 +0000 (08:07 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 17 Jan 2026 15:35:10 +0000 (16:35 +0100)
commit fb321998de7639f1954430674475e469fb529d9c upstream.

The loop in nfsd4_revoke_states() stops one too early because
the end value given is CLIENT_HASH_MASK where it should be
CLIENT_HASH_SIZE.

This means that an admin request to drop all locks for a filesystem will
miss locks held by clients which hash to the maximum possible hash value.

Fixes: 1ac3629bf012 ("nfsd: prepare for supporting admin-revocation of state")
Cc: stable@vger.kernel.org
Signed-off-by: NeilBrown <neil@brown.name>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfsd/nfs4state.c

index 70b5c478541b6aa43d576c993a6b2250a339f445..ae39e563c2641cb9b9a8067ec660083c82b3284e 100644 (file)
@@ -1780,7 +1780,7 @@ void nfsd4_revoke_states(struct net *net, struct super_block *sb)
        sc_types = SC_TYPE_OPEN | SC_TYPE_LOCK | SC_TYPE_DELEG | SC_TYPE_LAYOUT;
 
        spin_lock(&nn->client_lock);
-       for (idhashval = 0; idhashval < CLIENT_HASH_MASK; idhashval++) {
+       for (idhashval = 0; idhashval < CLIENT_HASH_SIZE; idhashval++) {
                struct list_head *head = &nn->conf_id_hashtbl[idhashval];
                struct nfs4_client *clp;
        retry: