Re: [PATCH 4/5] fanotify21: Add test variants for FAN_REPORT_TID
Jan Kara <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <6mmzrxshvigoncgtzpugeevhiup67a45eqjeq2daq42gejyknn@nkxqmcpmylrr> |
On Tue 16-06-26 02:06:28, AnonymeMeow wrote: > 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]> Looks good. Feel free to add: Reviewed-by: Jan Kara <[email protected]> Honza > --- > include/lapi/pidfd.h | 4 ++ > .../kernel/syscalls/fanotify/fanotify21.c | 56 ++++++++++++++----- > 2 files changed, 47 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..fd43c8c1c 100644 > --- a/testcases/kernel/syscalls/fanotify/fanotify21.c > +++ b/testcases/kernel/syscalls/fanotify/fanotify21.c > @@ -12,6 +12,7 @@ > * > * 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. > */ > > #define _GNU_SOURCE > @@ -32,6 +33,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 +71,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 +95,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 +133,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 +155,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 +162,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 +363,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 > -- Jan Kara <jack-IBi9RG/[email protected]> SUSE Labs, CR -- Mailing list info: https://lists.linux.it/listinfo/ltp