public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Jan Kara <jack@suse.cz>
Cc: Christian Brauner <brauner@kernel.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Chuck Lever <chuck.lever@oracle.com>,
	Jeff Layton <jlayton@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH 2/2] fs: use simple_end_creating helper to consolidate fsnotify hooks
Date: Mon,  2 Mar 2026 19:37:41 +0100	[thread overview]
Message-ID: <20260302183741.1308767-3-amir73il@gmail.com> (raw)
In-Reply-To: <20260302183741.1308767-1-amir73il@gmail.com>

Add simple_end_creating() helper which combines fsnotify_create/mkdir()
hook and simple_done_creating().

Use the new helper to consolidate this pattern in several pseudo fs
which had open coded fsnotify_create/mkdir() hooks:
binderfs, debugfs, nfsctl, tracefs, rpc_pipefs.

For those filesystems, the paired fsnotify_delete() hook is already
inside the library helper simple_recursive_removal().

Note that in debugfs_create_symlink(), the fsnotify hook was missing,
so the missing hook is fixed by this change.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 drivers/android/binder/rust_binderfs.c | 11 +++--------
 drivers/android/binderfs.c             | 10 +++-------
 fs/debugfs/inode.c                     |  5 +----
 fs/libfs.c                             | 14 ++++++++++++++
 fs/nfsd/nfsctl.c                       | 11 +++--------
 fs/tracefs/event_inode.c               |  2 --
 fs/tracefs/inode.c                     |  5 +----
 include/linux/fs.h                     |  1 +
 net/sunrpc/rpc_pipe.c                  | 10 +++-------
 9 files changed, 29 insertions(+), 40 deletions(-)

diff --git a/drivers/android/binder/rust_binderfs.c b/drivers/android/binder/rust_binderfs.c
index ade1c4d924992..d69490c6b9e09 100644
--- a/drivers/android/binder/rust_binderfs.c
+++ b/drivers/android/binder/rust_binderfs.c
@@ -3,7 +3,6 @@
 #include <linux/compiler_types.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
-#include <linux/fsnotify.h>
 #include <linux/gfp.h>
 #include <linux/idr.h>
 #include <linux/init.h>
@@ -186,9 +185,7 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
 
 	inode->i_private = device;
 	d_make_persistent(dentry, inode);
-
-	fsnotify_create(root->d_inode, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 
 	return 0;
 
@@ -481,8 +478,7 @@ static struct dentry *rust_binderfs_create_file(struct dentry *parent, const cha
 	}
 
 	d_make_persistent(dentry, new_inode);
-	fsnotify_create(parent->d_inode, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry;
 }
 
@@ -522,8 +518,7 @@ static struct dentry *binderfs_create_dir(struct dentry *parent,
 	inc_nlink(parent->d_inode);
 	set_nlink(new_inode, 2);
 	d_make_persistent(dentry, new_inode);
-	fsnotify_mkdir(parent->d_inode, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry;
 }
 
diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c
index 361d69f756f50..60277f0bb679f 100644
--- a/drivers/android/binderfs.c
+++ b/drivers/android/binderfs.c
@@ -3,7 +3,6 @@
 #include <linux/compiler_types.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
-#include <linux/fsnotify.h>
 #include <linux/gfp.h>
 #include <linux/idr.h>
 #include <linux/init.h>
@@ -190,8 +189,7 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
 	}
 	inode->i_private = device;
 	d_make_persistent(dentry, inode);
-	fsnotify_create(root->d_inode, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 
 	binder_add_device(device);
 
@@ -490,8 +488,7 @@ struct dentry *binderfs_create_file(struct dentry *parent, const char *name,
 	new_inode->i_fop = fops;
 	new_inode->i_private = data;
 	d_make_persistent(dentry, new_inode);
-	fsnotify_create(parent_inode, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry; // borrowed
 }
 
@@ -521,8 +518,7 @@ static struct dentry *binderfs_create_dir(struct dentry *parent,
 	set_nlink(new_inode, 2);
 	d_make_persistent(dentry, new_inode);
 	inc_nlink(parent_inode);
-	fsnotify_mkdir(parent_inode, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry;
 }
 
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 4598142355b97..f51b008d42cbf 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -409,7 +409,7 @@ static struct dentry *debugfs_failed_creating(struct dentry *dentry)
 
 static struct dentry *debugfs_end_creating(struct dentry *dentry)
 {
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry; // borrowed
 }
 
@@ -448,7 +448,6 @@ static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
 	DEBUGFS_I(inode)->aux = (void *)aux;
 
 	d_make_persistent(dentry, inode);
-	fsnotify_create(d_inode(dentry->d_parent), dentry);
 	return debugfs_end_creating(dentry);
 }
 
@@ -590,7 +589,6 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
 	inc_nlink(inode);
 	d_make_persistent(dentry, inode);
 	inc_nlink(d_inode(dentry->d_parent));
-	fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
 	return debugfs_end_creating(dentry);
 }
 EXPORT_SYMBOL_GPL(debugfs_create_dir);
@@ -632,7 +630,6 @@ struct dentry *debugfs_create_automount(const char *name,
 	inc_nlink(inode);
 	d_make_persistent(dentry, inode);
 	inc_nlink(d_inode(dentry->d_parent));
-	fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
 	return debugfs_end_creating(dentry);
 }
 EXPORT_SYMBOL(debugfs_create_automount);
diff --git a/fs/libfs.c b/fs/libfs.c
index 74134ba2e8d1e..2f6dcae40ce7f 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -2322,3 +2322,17 @@ void simple_done_creating(struct dentry *child)
 	dput(child);
 }
 EXPORT_SYMBOL(simple_done_creating);
+
+/*
+ * Like simple_done_creating(), but also fires fsnotify_create() for the
+ * new dentry.  Call on the success path after d_make_persistent().
+ * Use simple_done_creating() on the failure path where the child dentry is
+ * still negative.
+ */
+void simple_end_creating(struct dentry *child)
+{
+	fsnotify_create(child->d_parent->d_inode, child);
+	inode_unlock(child->d_parent->d_inode);
+	dput(child);
+}
+EXPORT_SYMBOL(simple_end_creating);
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index e9acd2cd602cb..6e600d52b66d0 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -17,7 +17,6 @@
 #include <linux/sunrpc/rpc_pipe_fs.h>
 #include <linux/sunrpc/svc.h>
 #include <linux/module.h>
-#include <linux/fsnotify.h>
 #include <linux/nfslocalio.h>
 
 #include "idmap.h"
@@ -1146,8 +1145,7 @@ static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *nc
 	}
 	d_make_persistent(dentry, inode);
 	inc_nlink(dir);
-	fsnotify_mkdir(dir, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry;	// borrowed
 }
 
@@ -1178,8 +1176,7 @@ static void _nfsd_symlink(struct dentry *parent, const char *name,
 	inode->i_size = strlen(content);
 
 	d_make_persistent(dentry, inode);
-	fsnotify_create(dir, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 }
 #else
 static inline void _nfsd_symlink(struct dentry *parent, const char *name,
@@ -1219,7 +1216,6 @@ static int nfsdfs_create_files(struct dentry *root,
 				struct nfsdfs_client *ncl,
 				struct dentry **fdentries)
 {
-	struct inode *dir = d_inode(root);
 	struct dentry *dentry;
 
 	for (int i = 0; files->name && files->name[0]; i++, files++) {
@@ -1236,10 +1232,9 @@ static int nfsdfs_create_files(struct dentry *root,
 		inode->i_fop = files->ops;
 		inode->i_private = ncl;
 		d_make_persistent(dentry, inode);
-		fsnotify_create(dir, dentry);
 		if (fdentries)
 			fdentries[i] = dentry; // borrowed
-		simple_done_creating(dentry);
+		simple_end_creating(dentry);
 	}
 	return 0;
 }
diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c
index 8e5ac464b3284..059ea7560b9b4 100644
--- a/fs/tracefs/event_inode.c
+++ b/fs/tracefs/event_inode.c
@@ -14,7 +14,6 @@
  *  inodes/dentries in a just-in-time (JIT) manner. The eventfs will clean up
  *  and delete the inodes/dentries when they are no longer referenced.
  */
-#include <linux/fsnotify.h>
 #include <linux/fs.h>
 #include <linux/namei.h>
 #include <linux/workqueue.h>
@@ -826,7 +825,6 @@ struct eventfs_inode *eventfs_create_events_dir(const char *name, struct dentry
 	d_make_persistent(dentry, inode);
 	/* The dentry of the "events" parent does keep track though */
 	inc_nlink(dentry->d_parent->d_inode);
-	fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
 	tracefs_end_creating(dentry);
 
 	return ei;
diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c
index 51c00c8fa1755..90a15c064e309 100644
--- a/fs/tracefs/inode.c
+++ b/fs/tracefs/inode.c
@@ -16,7 +16,6 @@
 #include <linux/kobject.h>
 #include <linux/namei.h>
 #include <linux/tracefs.h>
-#include <linux/fsnotify.h>
 #include <linux/security.h>
 #include <linux/seq_file.h>
 #include <linux/magic.h>
@@ -578,7 +577,7 @@ struct dentry *tracefs_failed_creating(struct dentry *dentry)
 
 struct dentry *tracefs_end_creating(struct dentry *dentry)
 {
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return dentry;	// borrowed
 }
 
@@ -661,7 +660,6 @@ struct dentry *tracefs_create_file(const char *name, umode_t mode,
 	inode->i_uid = d_inode(dentry->d_parent)->i_uid;
 	inode->i_gid = d_inode(dentry->d_parent)->i_gid;
 	d_make_persistent(dentry, inode);
-	fsnotify_create(d_inode(dentry->d_parent), dentry);
 	return tracefs_end_creating(dentry);
 }
 
@@ -693,7 +691,6 @@ static struct dentry *__create_dir(const char *name, struct dentry *parent,
 	inc_nlink(inode);
 	d_make_persistent(dentry, inode);
 	inc_nlink(d_inode(dentry->d_parent));
-	fsnotify_mkdir(d_inode(dentry->d_parent), dentry);
 	return tracefs_end_creating(dentry);
 }
 
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8b3dd145b25ec..8e5080be34308 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3271,6 +3271,7 @@ extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int
 extern void simple_release_fs(struct vfsmount **mount, int *count);
 struct dentry *simple_start_creating(struct dentry *, const char *);
 void simple_done_creating(struct dentry *);
+void simple_end_creating(struct dentry *);
 
 extern ssize_t simple_read_from_buffer(void __user *to, size_t count,
 			loff_t *ppos, const void *from, size_t available);
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 9d349cfbc4831..84d0ba37d9d6f 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -16,7 +16,6 @@
 #include <linux/mount.h>
 #include <linux/fs_context.h>
 #include <linux/namei.h>
-#include <linux/fsnotify.h>
 #include <linux/kernel.h>
 #include <linux/rcupdate.h>
 #include <linux/utsname.h>
@@ -544,8 +543,7 @@ static int rpc_new_file(struct dentry *parent,
 		inode->i_fop = i_fop;
 	rpc_inode_setowner(inode, private);
 	d_make_persistent(dentry, inode);
-	fsnotify_create(dir, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return 0;
 }
 
@@ -569,8 +567,7 @@ static struct dentry *rpc_new_dir(struct dentry *parent,
 	inode->i_ino = iunique(dir->i_sb, 100);
 	inc_nlink(dir);
 	d_make_persistent(dentry, inode);
-	fsnotify_mkdir(dir, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 
 	return dentry; // borrowed
 }
@@ -667,8 +664,7 @@ int rpc_mkpipe_dentry(struct dentry *parent, const char *name,
 	rpc_inode_setowner(inode, private);
 	pipe->dentry = dentry; // borrowed
 	d_make_persistent(dentry, inode);
-	fsnotify_create(dir, dentry);
-	simple_done_creating(dentry);
+	simple_end_creating(dentry);
 	return 0;
 
 failed:
-- 
2.53.0


  parent reply	other threads:[~2026-03-02 18:37 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-02 18:37 [PATCH 0/2] fsnotify hooks consolidation Amir Goldstein
2026-03-02 18:37 ` [PATCH 1/2] fsnotify: make fsnotify_create() agnostic to file/dir Amir Goldstein
2026-03-02 18:37 ` Amir Goldstein [this message]
2026-03-02 22:28   ` [PATCH 2/2] fs: use simple_end_creating helper to consolidate fsnotify hooks Chuck Lever
2026-03-03 10:05     ` Amir Goldstein
2026-03-03 10:28       ` NeilBrown
2026-03-03 11:27         ` Amir Goldstein
2026-03-05  1:22           ` NeilBrown
2026-03-03 14:24       ` Chuck Lever
2026-03-03 15:01   ` Alice Ryhl
2026-03-03 12:45 ` [PATCH 0/2] fsnotify hooks consolidation Jeff Layton
2026-03-03 13:18   ` Amir Goldstein
2026-03-03 15:00     ` Christoph Hellwig
2026-03-03 15:05       ` Amir Goldstein
2026-03-03 15:07         ` Christoph Hellwig
2026-03-03 15:17           ` Amir Goldstein

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=20260302183741.1308767-3-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=brauner@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jack@suse.cz \
    --cc=jlayton@kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=rostedt@goodmis.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