Re: [PATCH 0/4] NFSD: CB_RECALL_ANY fixes and a meaningful keep count
Jeff Layton <[email protected]>
| Newsgroups | gmane.linux.nfs |
|---|---|
| Message-ID | <[email protected]> |
On Tue, 2026-08-11 at 15:52 -0400, Chuck Lever wrote: > 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 <[email protected]> Looks reasonable. Reviewed-by: Jeff Layton <[email protected]>