[PATCH v2 4/5] fanotify21: Add test variants for FAN_REPORT_TID
AnonymeMeow <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
Add test variants for FAN_REPORT_PIDFD combined with FAN_REPORT_TID, both with and without FAN_REPORT_FD_ERROR. Add PIDFD_THREAD fallback definition for old headers. Signed-off-by: AnonymeMeow <[email protected]> Reviewed-by: Jan Kara <[email protected]> Reviewed-by: Amir Goldstein <[email protected]> --- include/lapi/pidfd.h | 4 ++ .../kernel/syscalls/fanotify/fanotify21.c | 57 ++++++++++++++----- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/include/lapi/pidfd.h b/include/lapi/pidfd.h index a3205032c..eb4e3466d 100644 --- a/include/lapi/pidfd.h +++ b/include/lapi/pidfd.h @@ -43,6 +43,10 @@ struct pidfd_info { # define PIDFD_NONBLOCK O_NONBLOCK #endif +#ifndef PIDFD_THREAD +# define PIDFD_THREAD O_EXCL +#endif + #ifndef PIDFS_IOCTL_MAGIC # define PIDFS_IOCTL_MAGIC 0xFF #endif diff --git a/testcases/kernel/syscalls/fanotify/fanotify21.c b/testcases/kernel/syscalls/fanotify/fanotify21.c index 22f9767db..c05c69d58 100644 --- a/testcases/kernel/syscalls/fanotify/fanotify21.c +++ b/testcases/kernel/syscalls/fanotify/fanotify21.c @@ -12,6 +12,8 @@ * * NOTE: FAN_REPORT_PIDFD support was added in v5.15-rc1 in * af579beb666a ("fanotify: add pidfd support to the fanotify API"). + * FAN_REPORT_PIDFD combined with FAN_REPORT_TID is supported since v7.2-rc1 + * in 17171128513b ("fanotify: report thread pidfds for FAN_REPORT_TID"). */ #define _GNU_SOURCE @@ -32,6 +34,9 @@ #define MOUNT_PATH "fs_mnt" #define TEST_FILE MOUNT_PATH "/testfile" +#define TST_VARIANT_FD_ERROR (tst_variant & 1) +#define TST_VARIANT_PIDFD_THREAD (tst_variant & 2) + struct pidfd_fdinfo_t { int pos; int flags; @@ -67,6 +72,7 @@ static char event_buf[BUF_SZ]; static struct pidfd_fdinfo_t exp_pidfd_fdinfo; static int fd_error_unsupported; +static int thread_pidfd_unsupported; static struct tst_clone_args clone_args = { .flags = CLONE_NEWPID, @@ -90,21 +96,37 @@ static void read_pidfd_fdinfo(int pidfd, struct pidfd_fdinfo_t *pidfd_fdinfo) static void generate_event(void) { int fd; + int pidfd; + + pidfd = TST_VARIANT_PIDFD_THREAD ? SAFE_PIDFD_OPEN(tst_gettid(), PIDFD_THREAD) + : SAFE_PIDFD_OPEN(tst_getpid(), 0); + read_pidfd_fdinfo(pidfd, &exp_pidfd_fdinfo); + SAFE_CLOSE(pidfd); /* Generate a single FAN_OPEN event on the watched object. */ fd = SAFE_OPEN(TEST_FILE, O_RDONLY); SAFE_CLOSE(fd); } +static const char *test_variant_name(void) +{ + switch (tst_variant) { + case 0: return ""; + case 1: return "(FAN_REPORT_FD_ERROR)"; + case 2: return "(FAN_REPORT_TID)"; + case 3: return "(FAN_REPORT_FD_ERROR | FAN_REPORT_TID)"; + } + return NULL; +} + static void do_setup(void) { - int pidfd; int init_flags = FAN_REPORT_PIDFD; /* Bind mount so remount ro/rw always work */ SAFE_MOUNT(MOUNT_PATH, MOUNT_PATH, "none", MS_BIND, NULL); - if (tst_variant) { + if (TST_VARIANT_FD_ERROR) { fanotify_fd = -1; fd_error_unsupported = fanotify_init_flags_supported_on_fs(FAN_REPORT_FD_ERROR, "."); if (fd_error_unsupported) @@ -112,6 +134,15 @@ static void do_setup(void) init_flags |= FAN_REPORT_FD_ERROR; } + if (TST_VARIANT_PIDFD_THREAD) { + fanotify_fd = -1; + thread_pidfd_unsupported = fanotify_init_flags_supported_on_fs( + FAN_REPORT_PIDFD | FAN_REPORT_TID, "."); + if (thread_pidfd_unsupported) + return; + init_flags |= FAN_REPORT_TID; + } + SAFE_TOUCH(TEST_FILE, 0666, NULL); /* @@ -125,12 +156,6 @@ static void do_setup(void) fanotify_fd = SAFE_FANOTIFY_INIT(init_flags, O_RDWR); SAFE_FANOTIFY_MARK(fanotify_fd, FAN_MARK_ADD, FAN_OPEN, AT_FDCWD, TEST_FILE); - - pidfd = SAFE_PIDFD_OPEN(getpid(), 0); - - read_pidfd_fdinfo(pidfd, &exp_pidfd_fdinfo); - - SAFE_CLOSE(pidfd); } static void do_test(unsigned int num) @@ -138,19 +163,25 @@ static void do_test(unsigned int num) int i = 0, len; struct test_case_t *tc = &test_cases[num]; int nopidfd_err = tc->want_pidfd_err ? - (tst_variant ? -ESRCH : FAN_NOPIDFD) : 0; - int fd_err = (tc->remount_ro && tst_variant) ? -EROFS : 0; + (TST_VARIANT_FD_ERROR ? -ESRCH : FAN_NOPIDFD) : 0; + int fd_err = (tc->remount_ro && TST_VARIANT_FD_ERROR) ? -EROFS : 0; pid_t reader_pid; int reader_exit_status; tst_res(TINFO, "Test #%d.%d: %s %s", num, tst_variant, tc->name, - tst_variant ? "(FAN_REPORT_FD_ERROR)" : ""); + test_variant_name()); - if (fd_error_unsupported && tst_variant) { + if (fd_error_unsupported && TST_VARIANT_FD_ERROR) { FANOTIFY_INIT_FLAGS_ERR_MSG(FAN_REPORT_FD_ERROR, fd_error_unsupported); return; } + if (thread_pidfd_unsupported && TST_VARIANT_PIDFD_THREAD) { + FANOTIFY_INIT_FLAGS_ERR_MSG( + FAN_REPORT_PIDFD | FAN_REPORT_TID, thread_pidfd_unsupported); + return; + } + /* remount ro/rw the bind mount */ SAFE_MOUNT("none", MOUNT_PATH, "none", MS_BIND | MS_REMOUNT | (tc->remount_ro ? MS_RDONLY : 0), NULL); @@ -333,7 +364,7 @@ static struct tst_test test = { .setup = do_setup, .test = do_test, .tcnt = ARRAY_SIZE(test_cases), - .test_variants = 2, + .test_variants = 4, .cleanup = do_cleanup, .all_filesystems = 1, .needs_root = 1, -- 2.54.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp