Linux NFS development
 help / color / mirror / Atom feed
* [PATCH] nfsd: fix delegation_blocked() to block correctly for at least 30 seconds
@ 2024-09-09  5:06 NeilBrown
  2024-09-09 12:09 ` Benjamin Coddington
                   ` (3 more replies)
  0 siblings, 4 replies; 19+ messages in thread
From: NeilBrown @ 2024-09-09  5:06 UTC (permalink / raw)
  To: Chuck Lever, Jeff Layton, Olga Kornievskaia
  Cc: Dai Ngo, Tom Talpey, linux-nfs


The pair of bloom filtered used by delegation_blocked() was intended to
block delegations on given filehandles for between 30 and 60 seconds.  A
new filehandle would be recorded in the "new" bit set.  That would then
be switch to the "old" bit set between 0 and 30 seconds later, and it
would remain as the "old" bit set for 30 seconds.

Unfortunately the code intended to clear the old bit set once it reached
30 seconds old, preparing it to be the next new bit set, instead cleared
the *new* bit set before switching it to be the old bit set.  This means
that the "old" bit set is always empty and delegations are blocked
between 0 and 30 seconds.

This patch updates bd->new before clearing the set with that index,
instead of afterwards.

Reported-by: Olga Kornievskaia <okorniev@redhat.com>
Cc: stable@vger.kernel.org
Fixes: 6282cd565553 ("NFSD: Don't hand out delegations for 30 seconds after recalling them.")
Signed-off-by: NeilBrown <neilb@suse.de>
---
 fs/nfsd/nfs4state.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 4313addbe756..6f18c1a7af2e 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1078,7 +1078,8 @@ static void nfs4_free_deleg(struct nfs4_stid *stid)
  * When a delegation is recalled, the filehandle is stored in the "new"
  * filter.
  * Every 30 seconds we swap the filters and clear the "new" one,
- * unless both are empty of course.
+ * unless both are empty of course.  This results in delegations for a
+ * given filehandle being blocked for between 30 and 60 seconds.
  *
  * Each filter is 256 bits.  We hash the filehandle to 32bit and use the
  * low 3 bytes as hash-table indices.
@@ -1107,9 +1108,9 @@ static int delegation_blocked(struct knfsd_fh *fh)
 		if (ktime_get_seconds() - bd->swap_time > 30) {
 			bd->entries -= bd->old_entries;
 			bd->old_entries = bd->entries;
+			bd->new = 1-bd->new;
 			memset(bd->set[bd->new], 0,
 			       sizeof(bd->set[0]));
-			bd->new = 1-bd->new;
 			bd->swap_time = ktime_get_seconds();
 		}
 		spin_unlock(&blocked_delegations_lock);
-- 
2.44.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2024-09-27 12:44 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-09  5:06 [PATCH] nfsd: fix delegation_blocked() to block correctly for at least 30 seconds NeilBrown
2024-09-09 12:09 ` Benjamin Coddington
2024-09-09 12:10 ` Jeff Layton
2024-09-09 12:24 ` Jeff Layton
2024-09-09 14:17   ` Olga Kornievskaia
2024-09-09 14:28     ` Jeff Layton
2024-09-09 14:37     ` Chuck Lever
2024-09-09 15:02       ` Olga Kornievskaia
2024-09-09 15:14         ` Chuck Lever III
2024-09-10 12:32         ` Tom Talpey
2024-09-10 12:52           ` Jeff Layton
2024-09-10 13:28             ` Tom Talpey
2024-09-10 14:18           ` Chuck Lever III
2024-09-11  0:00   ` NeilBrown
2024-09-11 14:13     ` Olga Kornievskaia
2024-09-16  1:17       ` NeilBrown
2024-09-16  2:04         ` NeilBrown
2024-09-27 12:44         ` Benjamin Coddington
2024-09-09 14:45 ` cel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox