commit d67dff33e14af26f37114d0cd3c846816360f809 Author: Christian Brauner AuthorDate: Sat Mar 8 12:47:29 2025 +0100 Commit: Christian Brauner CommitDate: Sat Mar 8 13:07:26 2025 +0100 folded changes Signed-off-by: Christian Brauner diff --git a/tools/testing/selftests/filesystems/mount-notify/mount-notify_test.c b/tools/testing/selftests/filesystems/mount-notify/mount-notify_test.c index 7fa2e376e516..2f0bd360166d 100644 --- a/tools/testing/selftests/filesystems/mount-notify/mount-notify_test.c +++ b/tools/testing/selftests/filesystems/mount-notify/mount-notify_test.c @@ -16,11 +16,11 @@ #include "../../kselftest_harness.h" #include "../statmount/statmount.h" -#ifndef FAN_PRE_ACCESS -#define FAN_PRE_ACCESS 0x00100000 /* Pre-content access hook */ -#endif - #ifndef FAN_MNT_ATTACH +struct fanotify_event_info_mnt { + struct fanotify_event_info_header hdr; + __u64 mnt_id; +}; #define FAN_MNT_ATTACH 0x01000000 /* Mount was attached */ #endif @@ -32,91 +32,64 @@ #define FAN_REPORT_MNT 0x00004000 /* Report mount events */ #endif +#ifndef FAN_MARK_MNTNS +#define FAN_MARK_MNTNS 0x00000110 +#endif + static char root_mntpoint[] = "/tmp/mount-notify_test_root.XXXXXX"; static int orig_root, ns_fd; static uint64_t root_id; -static uint64_t get_mnt_id(const char *path) +static uint64_t get_mnt_id(struct __test_metadata *const _metadata, + const char *path) { struct statx sx; - int ret; - - ret = statx(AT_FDCWD, path, 0, STATX_MNT_ID_UNIQUE, &sx); - if (ret == -1) - ksft_exit_fail_perror("retrieving mount ID"); - - if (!(sx.stx_mask & STATX_MNT_ID_UNIQUE)) - ksft_exit_fail_msg("no mount ID available\n"); + ASSERT_EQ(statx(AT_FDCWD, path, 0, STATX_MNT_ID_UNIQUE, &sx), 0); + ASSERT_TRUE(!!(sx.stx_mask & STATX_MNT_ID_UNIQUE)); return sx.stx_mnt_id; } -static void cleanup_namespace(void) +static void cleanup_namespace(struct __test_metadata *const _metadata) { - int ret; - - ret = fchdir(orig_root); - if (ret == -1) - ksft_perror("fchdir to original root"); + ASSERT_EQ(fchdir(orig_root), 0); - ret = chroot("."); - if (ret == -1) - ksft_perror("chroot to original root"); + ASSERT_EQ(chroot("."), 0); - umount2(root_mntpoint, MNT_DETACH); - chdir(root_mntpoint); - rmdir("a"); - rmdir("b"); - chdir("/"); - rmdir(root_mntpoint); + EXPECT_EQ(umount2(root_mntpoint, MNT_DETACH), 0); + EXPECT_EQ(chdir(root_mntpoint), 0); + EXPECT_EQ(rmdir("a"), 0); + EXPECT_EQ(rmdir("b"), 0); + EXPECT_EQ(chdir("/"), 0); + EXPECT_EQ(rmdir(root_mntpoint), 0); } -static void setup_namespace(void) +static void setup_namespace(struct __test_metadata *const _metadata) { - int ret; - - ret = unshare(CLONE_NEWNS); - if (ret == -1) - ksft_exit_fail_perror("unsharing mountns and userns"); + ASSERT_EQ(unshare(CLONE_NEWNS), 0); ns_fd = open("/proc/self/ns/mnt", O_RDONLY); - if (ns_fd == -1) - ksft_exit_fail_perror("opening /proc/self/ns/mnt"); + ASSERT_GE(ns_fd, 0); - ret = mount("", "/", NULL, MS_REC|MS_PRIVATE, NULL); - if (ret == -1) - ksft_exit_fail_perror("making mount tree private"); + ASSERT_EQ(mount("", "/", NULL, MS_REC|MS_PRIVATE, NULL), 0); - if (!mkdtemp(root_mntpoint)) - ksft_exit_fail_perror("creating temporary directory"); + ASSERT_NE(mkdtemp(root_mntpoint), NULL); - orig_root = open("/", O_PATH); - if (orig_root == -1) - ksft_exit_fail_perror("opening root directory"); + orig_root = open("/", O_PATH | O_CLOEXEC); + ASSERT_GE(orig_root, 0); - atexit(cleanup_namespace); + ASSERT_EQ(mount(root_mntpoint, root_mntpoint, NULL, MS_BIND, NULL), 0); - ret = mount(root_mntpoint, root_mntpoint, NULL, MS_BIND, NULL); - if (ret == -1) - ksft_exit_fail_perror("mounting temp root"); + ASSERT_EQ(chroot(root_mntpoint), 0); - ret = chroot(root_mntpoint); - if (ret == -1) - ksft_exit_fail_perror("chroot to temp root"); + ASSERT_EQ(chdir("/"), 0); - ret = chdir("/"); - if (ret == -1) - ksft_exit_fail_perror("chdir to root"); + ASSERT_EQ(mkdir("a", 0700), 0); - ret = mkdir("a", 0700); - if (ret == -1) - ksft_exit_fail_perror("mkdir(a)"); - - ret = mkdir("b", 0700); - if (ret == -1) - ksft_exit_fail_perror("mkdir(b)"); + ASSERT_EQ(mkdir("b", 0700), 0); - root_id = get_mnt_id("/"); + root_id = get_mnt_id(_metadata, "/"); + ASSERT_NE(root_id, 0); } FIXTURE(fanotify) { @@ -138,6 +111,8 @@ FIXTURE_SETUP(fanotify) unsigned int i; int ret; + setup_namespace(_metadata); + // Clean up mount tree ret = mount("", "/", NULL, MS_PRIVATE, NULL); ASSERT_EQ(ret, 0); @@ -172,6 +147,7 @@ FIXTURE_SETUP(fanotify) FIXTURE_TEARDOWN(fanotify) { + cleanup_namespace(_metadata); ASSERT_EQ(self->rem, 0); close(self->fan_fd); } @@ -579,24 +555,4 @@ TEST_F(fanotify, pivot_root) check_mounted(_metadata, mnts, 1); } -int main(int argc, char *argv[]) -{ - int ret; - - ksft_print_header(); - - if (geteuid()) - ksft_exit_skip("mount notify requires root privileges\n"); - - ret = fanotify_init(FAN_REPORT_MNT, 0); - if (ret == -1) { - if (errno == EINVAL) - ksft_exit_skip("FAN_REPORT_MNT not supported\n"); - ksft_exit_fail_perror("fanotify_init(FAN_REPORT_MNT, 0)"); - } - close(ret); - - setup_namespace(); - - return test_harness_run(argc, argv); -} +TEST_HARNESS_MAIN