On Wed, 2026-04-08 at 14:16 -0400, Chuck Lever wrote: > On Tue, Apr 7, 2026, at 9:21 AM, Jeff Layton wrote: > > If a NFS client requests a directory delegation with a notification > > bitmask covering directory change events, the server shouldn't recall > > the delegation. Instead the client will be notified of the change after > > the fact. > > > > Add support for ignoring lease breaks on directory changes. Add a new > > flags parameter to try_break_deleg() and teach __break_lease how to > > ignore certain types of delegation break events. > > > > Signed-off-by: Jeff Layton <[email protected]> > > --- > > > diff --git a/fs/locks.c b/fs/locks.c > > index 8e44b1f6c15a..dafa0752fdce 100644 > > --- a/fs/locks.c > > +++ b/fs/locks.c > > > @@ -1670,7 +1709,7 @@ int __break_lease(struct inode *inode, unsigned int > > flags) > > locks_delete_lock_ctx(&fl->c, &dispose); > > } > > > > - if (list_empty(&ctx->flc_lease)) > > + if (!visible_leases_remaining(inode, flags)) > > goto out; > > > > if (flags & LEASE_BREAK_NONBLOCK) { > > After breaking visible leases, the restart: label calls any_leases_conflict() > which does not filter ignored dir-delegation leases. When only ignored leases > remain, any_leases_conflict returns true, but visible_leases_remaining also > returned true (triggering the wait). The code picks the first lease (possibly > ignored), computes break_time = 1 jiffy, blocks, then loops. > > > For example, suppose you have two directory delegations on a directory, one > with FL_IGN_DIR_DELETE and one without. After the non-ignored one is broken > and removed, the ignored one keeps any_leases_conflict returning true. The > loop spins at 1-jiffy intervals until the ignored delegation is released. > > Should the restart: block skip ignored leases? >
Yep. The right fix is to switch the any_leases_conflict() call to visible_leases_remaining(). I'll code that up and test it. Thanks for the review! -- Jeff Layton <[email protected]>
