On Mon 03-02-25 23:32:04, Amir Goldstein wrote: > Most pseudo files are not applicable for fsnotify events at all, > let alone to the new pre-content events. > > Disable notifications to all files allocated with alloc_file_pseudo() > and enable legacy inotify events for the specific cases of pipe and > socket, which have known users of inotify events. > > Pre-content events are also kept disabled for sockets and pipes. > > Fixes: 20bf82a898b6 ("mm: don't allow huge faults for files with pre content watches") > Reported-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > Closes: https://lore.kernel.org/linux-fsdevel/20250131121703.1e4d00a7.alex.williamson@xxxxxxxxxx/ > Suggested-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Link: https://lore.kernel.org/linux-fsdevel/CAHk-=wi2pThSVY=zhO=ZKxViBj5QCRX-=AS2+rVknQgJnHXDFg@xxxxxxxxxxxxxx/ > Tested-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/file_table.c | 11 +++++++++++ > fs/open.c | 4 ++-- > fs/pipe.c | 6 ++++++ > net/socket.c | 5 +++++ > 4 files changed, 24 insertions(+), 2 deletions(-) > > diff --git a/fs/file_table.c b/fs/file_table.c > index f0291a66f9db4..35b93da6c5cb1 100644 > --- a/fs/file_table.c > +++ b/fs/file_table.c > @@ -375,7 +375,13 @@ struct file *alloc_file_pseudo(struct inode *inode, struct vfsmount *mnt, > if (IS_ERR(file)) { > ihold(inode); > path_put(&path); > + return file; > } > + /* > + * Disable all fsnotify events for pseudo files by default. > + * They may be enabled by caller with file_set_fsnotify_mode(). > + */ > + file_set_fsnotify_mode(file, FMODE_NONOTIFY); > return file; > } > EXPORT_SYMBOL(alloc_file_pseudo); > @@ -400,6 +406,11 @@ struct file *alloc_file_pseudo_noaccount(struct inode *inode, > return file; > } > file_init_path(file, &path, fops); > + /* > + * Disable all fsnotify events for pseudo files by default. > + * They may be enabled by caller with file_set_fsnotify_mode(). > + */ > + file_set_fsnotify_mode(file, FMODE_NONOTIFY); > return file; > } > EXPORT_SYMBOL_GPL(alloc_file_pseudo_noaccount); > diff --git a/fs/open.c b/fs/open.c > index 3fcbfff8aede8..1be20de9f283a 100644 > --- a/fs/open.c > +++ b/fs/open.c > @@ -936,8 +936,8 @@ static int do_dentry_open(struct file *f, > > /* > * Set FMODE_NONOTIFY_* bits according to existing permission watches. > - * If FMODE_NONOTIFY was already set for an fanotify fd, this doesn't > - * change anything. > + * If FMODE_NONOTIFY mode was already set for an fanotify fd or for a > + * pseudo file, this call will not change the mode. > */ > file_set_fsnotify_mode_from_watchers(f); > error = fsnotify_open_perm(f); > diff --git a/fs/pipe.c b/fs/pipe.c > index 94b59045ab44b..ce1af7592780d 100644 > --- a/fs/pipe.c > +++ b/fs/pipe.c > @@ -960,6 +960,12 @@ int create_pipe_files(struct file **res, int flags) > res[1] = f; > stream_open(inode, res[0]); > stream_open(inode, res[1]); > + /* > + * Disable permission and pre-content events, but enable legacy > + * inotify events for legacy users. > + */ > + file_set_fsnotify_mode(res[0], FMODE_NONOTIFY_PERM); > + file_set_fsnotify_mode(res[1], FMODE_NONOTIFY_PERM); > return 0; > } > > diff --git a/net/socket.c b/net/socket.c > index 262a28b59c7f0..28bae5a942341 100644 > --- a/net/socket.c > +++ b/net/socket.c > @@ -479,6 +479,11 @@ struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname) > sock->file = file; > file->private_data = sock; > stream_open(SOCK_INODE(sock), file); > + /* > + * Disable permission and pre-content events, but enable legacy > + * inotify events for legacy users. > + */ > + file_set_fsnotify_mode(file, FMODE_NONOTIFY_PERM); > return file; > } > EXPORT_SYMBOL(sock_alloc_file); > -- > 2.34.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR