[PATCH 3/4] inotify_user: add system call inotify_add_watch_at()

From: Max Kellermann
Date: Mon Sep 18 2023 - 08:33:47 EST


This implements a missing piece in the inotify API: referring to a
file by a directory file descriptor and a path name. This can be
solved in userspace currently only by doing something similar to:

int old = open(".");
fchdir(dfd);
inotify_add_watch(....);
fchdir(old);

Support for LOOKUP_EMPTY is still missing. We could add another IN_*
flag for that (which would clutter the IN_* flags list further) or
add a "flags" parameter to the new system call (which would however
duplicate features already present via special IN_* flags).

To: Jan Kara <jack@xxxxxxx>
Cc: Amir Goldstein <amir73il@xxxxxxxxx>
To: linux-fsdevel@xxxxxxxxxxxxxxx
To: linux-kernel@xxxxxxxxxxxxxxx
Signed-off-by: Max Kellermann <max.kellermann@xxxxxxxxx>
---
fs/notify/inotify/inotify_user.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
index b6e6f6ab21f8..8a9096c5ebb1 100644
--- a/fs/notify/inotify/inotify_user.c
+++ b/fs/notify/inotify/inotify_user.c
@@ -797,6 +797,12 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
return do_inotify_add_watch(fd, AT_FDCWD, pathname, mask);
}

+SYSCALL_DEFINE4(inotify_add_watch_at, int, fd, int, dfd, const char __user *, pathname,
+ u32, mask)
+{
+ return do_inotify_add_watch(fd, dfd, pathname, mask);
+}
+
SYSCALL_DEFINE2(inotify_rm_watch, int, fd, __s32, wd)
{
struct fsnotify_group *group;
--
2.39.2