1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2021 Google. All Rights Reserved.
4*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2022 Petr Vorel <[email protected]>
5*49cdfc7eSAndroid Build Coastguard Worker *
6*49cdfc7eSAndroid Build Coastguard Worker * Started by Matthew Bobrowski <[email protected]>
7*49cdfc7eSAndroid Build Coastguard Worker */
8*49cdfc7eSAndroid Build Coastguard Worker
9*49cdfc7eSAndroid Build Coastguard Worker /*\
10*49cdfc7eSAndroid Build Coastguard Worker * [Description]
11*49cdfc7eSAndroid Build Coastguard Worker *
12*49cdfc7eSAndroid Build Coastguard Worker * This source file contains a test case which ensures that the fanotify API
13*49cdfc7eSAndroid Build Coastguard Worker * returns an expected error code when provided an invalid initialization flag
14*49cdfc7eSAndroid Build Coastguard Worker * alongside FAN_REPORT_PIDFD. Additionally, it checks that the operability with
15*49cdfc7eSAndroid Build Coastguard Worker * existing FAN_REPORT_* flags is maintained and functioning as intended.
16*49cdfc7eSAndroid Build Coastguard Worker *
17*49cdfc7eSAndroid Build Coastguard Worker * NOTE: FAN_REPORT_PIDFD support was added in v5.15-rc1 in af579beb666a
18*49cdfc7eSAndroid Build Coastguard Worker * ("fanotify: add pidfd support to the fanotify API").
19*49cdfc7eSAndroid Build Coastguard Worker */
20*49cdfc7eSAndroid Build Coastguard Worker
21*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
22*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
23*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
24*49cdfc7eSAndroid Build Coastguard Worker
25*49cdfc7eSAndroid Build Coastguard Worker #ifdef HAVE_SYS_FANOTIFY_H
26*49cdfc7eSAndroid Build Coastguard Worker #include "fanotify.h"
27*49cdfc7eSAndroid Build Coastguard Worker
28*49cdfc7eSAndroid Build Coastguard Worker #define MOUNT_PATH "fs_mnt"
29*49cdfc7eSAndroid Build Coastguard Worker #define FLAGS_DESC(x) .flags = x, .desc = #x
30*49cdfc7eSAndroid Build Coastguard Worker
31*49cdfc7eSAndroid Build Coastguard Worker static int fd;
32*49cdfc7eSAndroid Build Coastguard Worker
33*49cdfc7eSAndroid Build Coastguard Worker static struct test_case_t {
34*49cdfc7eSAndroid Build Coastguard Worker unsigned int flags;
35*49cdfc7eSAndroid Build Coastguard Worker char *desc;
36*49cdfc7eSAndroid Build Coastguard Worker int exp_errno;
37*49cdfc7eSAndroid Build Coastguard Worker } test_cases[] = {
38*49cdfc7eSAndroid Build Coastguard Worker {
39*49cdfc7eSAndroid Build Coastguard Worker FLAGS_DESC(FAN_REPORT_PIDFD | FAN_REPORT_TID),
40*49cdfc7eSAndroid Build Coastguard Worker .exp_errno = EINVAL,
41*49cdfc7eSAndroid Build Coastguard Worker },
42*49cdfc7eSAndroid Build Coastguard Worker {
43*49cdfc7eSAndroid Build Coastguard Worker FLAGS_DESC(FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME),
44*49cdfc7eSAndroid Build Coastguard Worker },
45*49cdfc7eSAndroid Build Coastguard Worker };
46*49cdfc7eSAndroid Build Coastguard Worker
do_setup(void)47*49cdfc7eSAndroid Build Coastguard Worker static void do_setup(void)
48*49cdfc7eSAndroid Build Coastguard Worker {
49*49cdfc7eSAndroid Build Coastguard Worker /*
50*49cdfc7eSAndroid Build Coastguard Worker * An explicit check for FAN_REPORT_PIDFD is performed early on in the
51*49cdfc7eSAndroid Build Coastguard Worker * test initialization as it's a prerequisite for all test cases.
52*49cdfc7eSAndroid Build Coastguard Worker */
53*49cdfc7eSAndroid Build Coastguard Worker REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_ON_FS(FAN_REPORT_PIDFD,
54*49cdfc7eSAndroid Build Coastguard Worker MOUNT_PATH);
55*49cdfc7eSAndroid Build Coastguard Worker }
56*49cdfc7eSAndroid Build Coastguard Worker
do_test(unsigned int i)57*49cdfc7eSAndroid Build Coastguard Worker static void do_test(unsigned int i)
58*49cdfc7eSAndroid Build Coastguard Worker {
59*49cdfc7eSAndroid Build Coastguard Worker struct test_case_t *tc = &test_cases[i];
60*49cdfc7eSAndroid Build Coastguard Worker
61*49cdfc7eSAndroid Build Coastguard Worker tst_res(TINFO, "Test %s on %s", tc->exp_errno ? "fail" : "pass",
62*49cdfc7eSAndroid Build Coastguard Worker tc->desc);
63*49cdfc7eSAndroid Build Coastguard Worker
64*49cdfc7eSAndroid Build Coastguard Worker TST_EXP_FD_OR_FAIL(fd = fanotify_init(tc->flags, O_RDONLY),
65*49cdfc7eSAndroid Build Coastguard Worker tc->exp_errno);
66*49cdfc7eSAndroid Build Coastguard Worker
67*49cdfc7eSAndroid Build Coastguard Worker if (fd > 0)
68*49cdfc7eSAndroid Build Coastguard Worker SAFE_CLOSE(fd);
69*49cdfc7eSAndroid Build Coastguard Worker }
70*49cdfc7eSAndroid Build Coastguard Worker
do_cleanup(void)71*49cdfc7eSAndroid Build Coastguard Worker static void do_cleanup(void)
72*49cdfc7eSAndroid Build Coastguard Worker {
73*49cdfc7eSAndroid Build Coastguard Worker if (fd > 0)
74*49cdfc7eSAndroid Build Coastguard Worker SAFE_CLOSE(fd);
75*49cdfc7eSAndroid Build Coastguard Worker }
76*49cdfc7eSAndroid Build Coastguard Worker
77*49cdfc7eSAndroid Build Coastguard Worker static struct tst_test test = {
78*49cdfc7eSAndroid Build Coastguard Worker .setup = do_setup,
79*49cdfc7eSAndroid Build Coastguard Worker .test = do_test,
80*49cdfc7eSAndroid Build Coastguard Worker .tcnt = ARRAY_SIZE(test_cases),
81*49cdfc7eSAndroid Build Coastguard Worker .cleanup = do_cleanup,
82*49cdfc7eSAndroid Build Coastguard Worker .all_filesystems = 1,
83*49cdfc7eSAndroid Build Coastguard Worker .needs_root = 1,
84*49cdfc7eSAndroid Build Coastguard Worker .mntpoint = MOUNT_PATH,
85*49cdfc7eSAndroid Build Coastguard Worker };
86*49cdfc7eSAndroid Build Coastguard Worker
87*49cdfc7eSAndroid Build Coastguard Worker #else
88*49cdfc7eSAndroid Build Coastguard Worker TST_TEST_TCONF("system doesn't have required fanotify support");
89*49cdfc7eSAndroid Build Coastguard Worker #endif /* HAVE_SYS_FANOTIFY_H */
90