aboutsummaryrefslogtreecommitdiff
path: root/testcases/kernel/syscalls/fanotify/fanotify13.c
diff options
context:
space:
mode:
Diffstat (limited to 'testcases/kernel/syscalls/fanotify/fanotify13.c')
-rw-r--r--testcases/kernel/syscalls/fanotify/fanotify13.c63
1 files changed, 58 insertions, 5 deletions
diff --git a/testcases/kernel/syscalls/fanotify/fanotify13.c b/testcases/kernel/syscalls/fanotify/fanotify13.c
index c3daaf3a2..a25a360fd 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify13.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify13.c
@@ -25,6 +25,7 @@
#include <sys/statfs.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/mount.h>
#include <errno.h>
#include <unistd.h>
#include "tst_test.h"
@@ -37,7 +38,7 @@
#define DIR_ONE "dir_one"
#define FILE_ONE "file_one"
#define FILE_TWO "file_two"
-#define MOUNT_PATH "mntpoint"
+#define MOUNT_PATH "tstmnt"
#define EVENT_MAX ARRAY_SIZE(objects)
#define DIR_PATH_ONE MOUNT_PATH"/"DIR_ONE
#define FILE_PATH_ONE MOUNT_PATH"/"FILE_ONE
@@ -88,6 +89,8 @@ static struct test_case_t {
}
};
+static int ovl_mounted;
+static int bind_mounted;
static int nofid_fd;
static int fanotify_fd;
static int filesystem_mark_unsupported;
@@ -143,8 +146,13 @@ static void do_test(unsigned int number)
struct fanotify_mark_type *mark = &tc->mark;
tst_res(TINFO,
- "Test #%d: FAN_REPORT_FID with mark flag: %s",
- number, mark->name);
+ "Test #%d.%d: FAN_REPORT_FID with mark flag: %s",
+ number, tst_variant, mark->name);
+
+ if (tst_variant && !ovl_mounted) {
+ tst_res(TCONF, "overlayfs not supported on %s", tst_device->fs_type);
+ return;
+ }
if (filesystem_mark_unsupported && mark->flag & FAN_MARK_FILESYSTEM) {
tst_res(TCONF, "FAN_MARK_FILESYSTEM not supported in kernel?");
@@ -160,6 +168,15 @@ static void do_test(unsigned int number)
if (setup_marks(fanotify_fd, tc) != 0)
goto out;
+ /* Variant #1: watching upper fs - open files on overlayfs */
+ if (tst_variant == 1) {
+ if (mark->flag & FAN_MARK_MOUNT) {
+ tst_res(TCONF, "overlayfs upper fs cannot be watched with mount mark");
+ goto out;
+ }
+ SAFE_MOUNT(OVL_MNT, MOUNT_PATH, "none", MS_BIND, NULL);
+ }
+
/* Generate sequence of FAN_OPEN events on objects */
for (i = 0; i < ARRAY_SIZE(objects); i++)
fds[i] = SAFE_OPEN(objects[i].path, O_RDONLY);
@@ -174,6 +191,9 @@ static void do_test(unsigned int number)
SAFE_CLOSE(fds[i]);
}
+ if (tst_variant == 1)
+ SAFE_UMOUNT(MOUNT_PATH);
+
/* Read events from event queue */
len = SAFE_READ(0, fanotify_fd, events_buf, BUF_SIZE);
@@ -261,7 +281,32 @@ out:
static void do_setup(void)
{
- REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_ON_FS(FAN_REPORT_FID, MOUNT_PATH);
+ const char *mnt;
+
+ /*
+ * Bind mount to either base fs or to overlayfs over base fs:
+ * Variant #0: watch base fs - open files on base fs
+ * Variant #1: watch upper fs - open files on overlayfs
+ *
+ * Variant #1 tests a bug whose fix bc2473c90fca ("ovl: enable fsnotify
+ * events on underlying real files") in kernel 6.5 is not likely to be
+ * backported to older kernels.
+ * To avoid waiting for events that won't arrive when testing old kernels,
+ * require that kernel supports encoding fid with new flag AT_HADNLE_FID,
+ * also merged to 6.5 and not likely to be backported to older kernels.
+ */
+ if (tst_variant) {
+ REQUIRE_HANDLE_TYPE_SUPPORTED_BY_KERNEL(AT_HANDLE_FID);
+ ovl_mounted = TST_MOUNT_OVERLAY();
+ mnt = OVL_UPPER;
+ } else {
+ mnt = OVL_BASE_MNTPOINT;
+
+ }
+ REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_ON_FS(FAN_REPORT_FID, mnt);
+ SAFE_MKDIR(MOUNT_PATH, 0755);
+ SAFE_MOUNT(mnt, MOUNT_PATH, "none", MS_BIND, NULL);
+ bind_mounted = 1;
filesystem_mark_unsupported = fanotify_mark_supported_by_kernel(FAN_MARK_FILESYSTEM);
@@ -287,19 +332,27 @@ static void do_cleanup(void)
SAFE_CLOSE(nofid_fd);
if (fanotify_fd > 0)
SAFE_CLOSE(fanotify_fd);
+ if (bind_mounted) {
+ SAFE_UMOUNT(MOUNT_PATH);
+ SAFE_RMDIR(MOUNT_PATH);
+ }
+ if (ovl_mounted)
+ SAFE_UMOUNT(OVL_MNT);
}
static struct tst_test test = {
.test = do_test,
.tcnt = ARRAY_SIZE(test_cases),
+ .test_variants = 2,
.setup = do_setup,
.cleanup = do_cleanup,
.needs_root = 1,
.mount_device = 1,
- .mntpoint = MOUNT_PATH,
+ .mntpoint = OVL_BASE_MNTPOINT,
.all_filesystems = 1,
.tags = (const struct tst_tag[]) {
{"linux-git", "c285a2f01d69"},
+ {"linux-git", "bc2473c90fca"},
{}
}
};