Linux NFS development
 help / color / mirror / Atom feed
* [PATCH 0/4] NFSD: CB_RECALL_ANY fixes and a meaningful keep count
@ 2026-08-11 19:52 Chuck Lever
  2026-08-11 19:52 ` [PATCH 1/4] NFSD: Do not send CB_RECALL_ANY to NFSv4.0 clients Chuck Lever
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Chuck Lever @ 2026-08-11 19:52 UTC (permalink / raw)
  To: Jeff Layton, NeilBrown, Olga Kornievskaia, Dai Ngo, Tom Talpey
  Cc: linux-nfs, Chuck Lever

NFSD sends every CB_RECALL_ANY with craa_objects_to_keep set to
zero. RFC 8881 Section 20.6.3 reads that as a request to retain no
delegation at all, whether or not the delegation backs a file an
application still has open.

NFSD meant the callback as a signal to return unused delegations.
Only the Linux client has been tested against it, and that client
ignores craa_objects_to_keep and returns every unused delegation of
the named types, so the fixed zero never produced visible
misbehavior.

The NFSv4.0 recipient bug is fixed on its own so it can be
backported to LTS ahead of the rest. An NFSv4.0 callback service
rejects CB_RECALL_ANY, and nothing brings the callback channel back
up afterward (patch 1).

The keep count comes from a new per-client delegation count rather
than a walk of cl_delegations (patch 2). deleg_reaper() runs under
nn->client_lock, and cl_delegations is serialized by nn->deleg_lock,
which nests outside it, so the reaper cannot count the list. It
reads the counter without the lock and may not depend on the value.

Each callback asks a client to give up one delegation. A larger
request reaches delegations that applications still have open, and
both reaper callers re-arm while their condition lasts. A client
holding a single delegation is skipped rather than sent the old
zero. That strands one delegation per client, which this
best-effort design accepts for now.

NFSD sets no recall target and remembers nothing across callbacks.
RFC 8881 Section 20.6.4 prescribes CB_RECALL against specific
delegations once a client fails to return any. NFSD does not take
that step yet. CB_RECALL_ANY is asynchronous and reports no
completion, so NFSD treats it as advisory.

---
Chuck Lever (4):
      NFSD: Do not send CB_RECALL_ANY to NFSv4.0 clients
      NFSD: Count the delegations held by each client
      NFSD: Name directory delegations in the CB_RECALL_ANY type mask
      NFSD: Send a meaningful CB_RECALL_ANY keep count

 fs/nfsd/nfs4state.c | 27 +++++++++++++++++++++++----
 fs/nfsd/state.h     |  2 ++
 2 files changed, 25 insertions(+), 4 deletions(-)
---
base-commit: 1d479c6b53f684b27da84ec352b7efb97f7f115f
change-id: 20260810-recall-any-keep-count-f50c2ae1b792

Best regards,
--  
Chuck Lever <cel@kernel.org>


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

end of thread, other threads:[~2026-08-12 14:02 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-11 19:52 [PATCH 0/4] NFSD: CB_RECALL_ANY fixes and a meaningful keep count Chuck Lever
2026-08-11 19:52 ` [PATCH 1/4] NFSD: Do not send CB_RECALL_ANY to NFSv4.0 clients Chuck Lever
2026-08-11 19:52 ` [PATCH 2/4] NFSD: Count the delegations held by each client Chuck Lever
2026-08-11 19:52 ` [PATCH 3/4] NFSD: Name directory delegations in the CB_RECALL_ANY type mask Chuck Lever
2026-08-11 19:52 ` [PATCH 4/4] NFSD: Send a meaningful CB_RECALL_ANY keep count Chuck Lever
2026-08-12  6:17   ` Cedric Blancher
2026-08-12 10:29     ` Jeff Layton
2026-08-12 14:02     ` Chuck Lever
2026-08-12 10:26 ` [PATCH 0/4] NFSD: CB_RECALL_ANY fixes and a meaningful " Jeff Layton

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