public inbox for linux-doc@vger.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: Chuck Lever <cel@kernel.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	 Christian Brauner	 <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
	Chuck Lever	 <chuck.lever@oracle.com>,
	Alexander Aring <alex.aring@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Mathieu Desnoyers	 <mathieu.desnoyers@efficios.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Shuah Khan	 <skhan@linuxfoundation.org>,
	NeilBrown <neil@brown.name>,
	Olga Kornievskaia	 <okorniev@redhat.com>,
	Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>,
	 Trond Myklebust <trondmy@kernel.org>,
	Anna Schumaker <anna@kernel.org>,
	Amir Goldstein <amir73il@gmail.com>
Cc: Calum Mackay <calum.mackay@oracle.com>,
	linux-fsdevel@vger.kernel.org,  linux-kernel@vger.kernel.org,
	linux-trace-kernel@vger.kernel.org,  linux-doc@vger.kernel.org,
	linux-nfs@vger.kernel.org
Subject: Re: [PATCH 13/24] nfsd: add notification handlers for dir events
Date: Wed, 08 Apr 2026 15:40:40 -0400	[thread overview]
Message-ID: <2fed798124b3c3819cc20d7aa9104a55085fbe00.camel@kernel.org> (raw)
In-Reply-To: <f60c8d0f-45b6-4d4e-8944-dfd69f2cf9bf@app.fastmail.com>

On Wed, 2026-04-08 at 14:34 -0400, Chuck Lever wrote:
> 
> On Tue, Apr 7, 2026, at 9:21 AM, Jeff Layton wrote:
> > Add the necessary parts to accept a fsnotify callback for directory
> > change event and create a CB_NOTIFY request for it. When a dir nfsd_file
> > is created set a handle_event callback to handle the notification.
> > 
> > Use that to allocate a nfsd_notify_event object and then hand off a
> > reference to each delegation's CB_NOTIFY. If anything fails along the
> > way, recall any affected delegations.
> > 
> > Signed-off-by: Jeff Layton <jlayton@kernel.org>
> 
> > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> > index b2b8c454fc0f..339c3d0bb575 100644
> > --- a/fs/nfsd/nfs4state.c
> > +++ b/fs/nfsd/nfs4state.c
> 
> > @@ -9796,3 +9887,118 @@ nfsd_get_dir_deleg(struct nfsd4_compound_state 
> > *cstate,
> >  	put_nfs4_file(fp);
> >  	return ERR_PTR(status);
> >  }
> > +
> > +static void
> > +nfsd4_run_cb_notify(struct nfsd4_cb_notify *ncn)
> > +{
> > +	struct nfs4_delegation *dp = container_of(ncn, struct 
> > nfs4_delegation, dl_cb_notify);
> > +
> > +	if (test_and_set_bit(NFSD4_CALLBACK_RUNNING, &ncn->ncn_cb.cb_flags))
> > +		return;
> > +
> > +	if (!refcount_inc_not_zero(&dp->dl_stid.sc_count))
> > +		clear_bit(NFSD4_CALLBACK_RUNNING, &ncn->ncn_cb.cb_flags);
> > +	else
> > +		nfsd4_run_cb(&ncn->ncn_cb);
> > +}
> > +
> > +static struct nfsd_notify_event *
> > +alloc_nfsd_notify_event(u32 mask, const struct qstr *q, struct dentry 
> > *dentry)
> > +{
> > +	struct nfsd_notify_event *ne;
> > +
> > +	ne = kmalloc(sizeof(*ne) + q->len + 1, GFP_KERNEL);
> > +	if (!ne)
> > +		return NULL;
> > +
> > +	memcpy(&ne->ne_name, q->name, q->len);
> > +	refcount_set(&ne->ne_ref, 1);
> > +	ne->ne_mask = mask;
> > +	ne->ne_name[q->len] = '\0';
> > +	ne->ne_namelen = q->len;
> > +	ne->ne_dentry = dget(dentry);
> > +	return ne;
> > +}
> > +
> > +static bool
> > +should_notify_deleg(u32 mask, struct file_lease *fl)
> > +{
> > +	/* Only nfsd leases */
> > +	if (fl->fl_lmops != &nfsd_lease_mng_ops)
> > +		return false;
> > +
> > +	/* Skip if this event wasn't ignored by the lease */
> > +	if ((mask & FS_DELETE) && !(fl->c.flc_flags & FL_IGN_DIR_DELETE))
> > +		return false;
> > +	if ((mask & FS_CREATE) && !(fl->c.flc_flags & FL_IGN_DIR_CREATE))
> > +		return false;
> > +	if ((mask & FS_RENAME) && !(fl->c.flc_flags & FL_IGN_DIR_RENAME))
> > +		return false;
> > +
> > +	return true;
> > +}
> 
> For a cross-directory rename, vfs_rename calls try_break_deleg(old_dir,
> LEASE_BREAK_DIR_DELETE, ...). A delegation with FL_IGN_DIR_DELETE
> (subscribed to NOTIFY4_REMOVE_ENTRY) suppresses the lease break, which
> is correct.
> 
> But fsnotify delivers FS_RENAME on old_dir, not FS_DELETE. In
> should_notify_deleg(), the check (mask & FS_RENAME) &&
> !(fl->c.flc_flags & FL_IGN_DIR_RENAME) fails, because the delegation
> has FL_IGN_DIR_DELETE but not FL_IGN_DIR_RENAME. No notification is
> sent.
> 

Actually, it delivers FS_RENAME_FROM to the old directory and
FS_RENAME_TO to the new one in this case, AFAICT. Basically, we need to
watch for those in addition to FS_CREATE/DELETE and treat them the same
way. I'm looking at a fix now. I'll also see about adding a pynfs test
to do a cross directory rename with notifications. I don't think I have
that now.

Thanks!

> IIUC, a client subscribed to NOTIFY4_REMOVE_ENTRY for old_dir sees
> neither a lease break nor a CB_NOTIFY when a child is renamed out of
> the directory. Is that behavior correct?
> 
> 
> > +
> > +static void
> > +nfsd_recall_all_dir_delegs(const struct inode *dir)
> > +{
> > +	struct file_lock_context *ctx = locks_inode_context(dir);
> > +	struct file_lock_core *flc;
> > +
> > +	spin_lock(&ctx->flc_lock);
> > +	list_for_each_entry(flc, &ctx->flc_lease, flc_list) {
> > +		struct file_lease *fl = container_of(flc, struct file_lease, c);
> > +
> > +		if (fl->fl_lmops == &nfsd_lease_mng_ops)
> > +			nfsd_break_deleg_cb(fl);
> > +	}
> > +	spin_unlock(&ctx->flc_lock);
> > +}
> > +
> > +int
> > +nfsd_handle_dir_event(u32 mask, const struct inode *dir, const void 
> > *data,
> > +		      int data_type, const struct qstr *name)
> > +{
> > +	struct dentry *dentry = fsnotify_data_dentry(data, data_type);
> > +	struct file_lock_context *ctx;
> > +	struct file_lock_core *flc;
> > +	struct nfsd_notify_event *evt;
> > +
> > +	/* Don't do anything if this is not an expected event */
> > +	if (!(mask & (FS_CREATE|FS_DELETE|FS_RENAME)))
> > +		return 0;
> > +
> > +	ctx = locks_inode_context(dir);
> > +	if (!ctx || list_empty(&ctx->flc_lease))
> > +		return 0;
> > +
> > +	evt = alloc_nfsd_notify_event(mask, name, dentry);
> > +	if (!evt) {
> > +		nfsd_recall_all_dir_delegs(dir);
> > +		return 0;
> > +	}
> > +
> > +	spin_lock(&ctx->flc_lock);
> > +	list_for_each_entry(flc, &ctx->flc_lease, flc_list) {
> > +		struct file_lease *fl = container_of(flc, struct file_lease, c);
> > +		struct nfs4_delegation *dp = flc->flc_owner;
> > +		struct nfsd4_cb_notify *ncn = &dp->dl_cb_notify;
> > +
> > +		if (!should_notify_deleg(mask, fl))
> > +			continue;
> > +
> > +		spin_lock(&ncn->ncn_lock);
> > +		if (ncn->ncn_evt_cnt >= NOTIFY4_EVENT_QUEUE_SIZE) {
> > +			/* We're generating notifications too fast. Recall. */
> > +			spin_unlock(&ncn->ncn_lock);
> > +			nfsd_break_deleg_cb(fl);
> > +			continue;
> > +		}
> > +		ncn->ncn_evt[ncn->ncn_evt_cnt++] = nfsd_notify_event_get(evt);
> > +		spin_unlock(&ncn->ncn_lock);
> > +
> > +		nfsd4_run_cb_notify(ncn);
> > +	}
> > +	spin_unlock(&ctx->flc_lock);
> > +	nfsd_notify_event_put(evt);
> > +	return 0;
> > +}
> 

-- 
Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2026-04-08 19:40 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-07 13:21 [PATCH 00/24] vfs/nfsd: add support for CB_NOTIFY callbacks in directory delegations Jeff Layton
2026-04-07 13:21 ` [PATCH 01/24] filelock: add support for ignoring deleg breaks for dir change events Jeff Layton
2026-04-08 13:45   ` Jan Kara
2026-04-08 14:29     ` Jeff Layton
2026-04-08 18:16   ` Chuck Lever
2026-04-08 19:25     ` Jeff Layton
2026-04-07 13:21 ` [PATCH 02/24] filelock: add a tracepoint to start of break_lease() Jeff Layton
2026-04-08 13:45   ` Jan Kara
2026-04-07 13:21 ` [PATCH 03/24] filelock: add an inode_lease_ignore_mask helper Jeff Layton
2026-04-08 13:53   ` Jan Kara
2026-04-07 13:21 ` [PATCH 04/24] nfsd: add protocol support for CB_NOTIFY Jeff Layton
2026-04-07 13:21 ` [PATCH 05/24] nfs_common: add new NOTIFY4_* flags proposed in RFC8881bis Jeff Layton
2026-04-07 13:21 ` [PATCH 06/24] nfsd: allow nfsd to get a dir lease with an ignore mask Jeff Layton
2026-04-07 13:21 ` [PATCH 07/24] vfs: add fsnotify_modify_mark_mask() Jeff Layton
2026-04-08 13:51   ` Jan Kara
2026-04-07 13:21 ` [PATCH 08/24] nfsd: update the fsnotify mark when setting or removing a dir delegation Jeff Layton
2026-04-08 13:53   ` Jan Kara
2026-04-08 18:24   ` Chuck Lever
2026-04-08 19:29     ` Jeff Layton
2026-04-07 13:21 ` [PATCH 09/24] nfsd: make nfsd4_callback_ops->prepare operation bool return Jeff Layton
2026-04-07 13:21 ` [PATCH 10/24] nfsd: add callback encoding and decoding linkages for CB_NOTIFY Jeff Layton
2026-04-07 13:21 ` [PATCH 11/24] nfsd: use RCU to protect fi_deleg_file Jeff Layton
2026-04-07 13:21 ` [PATCH 12/24] nfsd: add data structures for handling CB_NOTIFY Jeff Layton
2026-04-08 18:39   ` Chuck Lever
2026-04-08 19:53     ` Jeff Layton
2026-04-07 13:21 ` [PATCH 13/24] nfsd: add notification handlers for dir events Jeff Layton
2026-04-08 18:34   ` Chuck Lever
2026-04-08 19:40     ` Jeff Layton [this message]
2026-04-07 13:21 ` [PATCH 14/24] nfsd: add tracepoint to dir_event handler Jeff Layton
2026-04-08  0:41   ` Steven Rostedt
2026-04-07 13:21 ` [PATCH 15/24] nfsd: apply the notify mask to the delegation when requested Jeff Layton
2026-04-07 13:21 ` [PATCH 16/24] nfsd: add helper to marshal a fattr4 from completed args Jeff Layton
2026-04-07 13:21 ` [PATCH 17/24] nfsd: allow nfsd4_encode_fattr4_change() to work with no export Jeff Layton
2026-04-07 13:21 ` [PATCH 18/24] nfsd: send basic file attributes in CB_NOTIFY Jeff Layton
2026-04-07 13:21 ` [PATCH 19/24] nfsd: allow encoding a filehandle into fattr4 without a svc_fh Jeff Layton
2026-04-07 13:21 ` [PATCH 20/24] nfsd: add a fi_connectable flag to struct nfs4_file Jeff Layton
2026-04-07 13:21 ` [PATCH 21/24] nfsd: add the filehandle to returned attributes in CB_NOTIFY Jeff Layton
2026-04-07 13:21 ` [PATCH 22/24] nfsd: properly track requested child attributes Jeff Layton
2026-04-07 13:21 ` [PATCH 23/24] nfsd: track requested dir attributes Jeff Layton
2026-04-07 13:21 ` [PATCH 24/24] nfsd: add support to CB_NOTIFY for dir attribute changes Jeff Layton
2026-04-08 13:55 ` [PATCH 00/24] vfs/nfsd: add support for CB_NOTIFY callbacks in directory delegations Jan Kara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2fed798124b3c3819cc20d7aa9104a55085fbe00.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=Dai.Ngo@oracle.com \
    --cc=alex.aring@gmail.com \
    --cc=amir73il@gmail.com \
    --cc=anna@kernel.org \
    --cc=brauner@kernel.org \
    --cc=calum.mackay@oracle.com \
    --cc=cel@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=corbet@lwn.net \
    --cc=jack@suse.cz \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=neil@brown.name \
    --cc=okorniev@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=skhan@linuxfoundation.org \
    --cc=tom@talpey.com \
    --cc=trondmy@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox