[LTP] [PATCH 1/6] syscalls/fcntl: New test for DN_RENAME (dnotify)

Amir Goldstein amir73il@gmail.com
Thu Apr 14 16:53:52 CEST 2022


Check that signal is delivered for directory watching for DN_RENAME
only when rename is within the same directory.
Even if both old and new directories are watches, DN_RENAME is not
generated on cross parent rename.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 runtest/syscalls                           |   2 +
 testcases/kernel/syscalls/fcntl/.gitignore |   2 +
 testcases/kernel/syscalls/fcntl/fcntl39.c  | 114 +++++++++++++++++++++
 3 files changed, 118 insertions(+)
 create mode 100644 testcases/kernel/syscalls/fcntl/fcntl39.c

diff --git a/runtest/syscalls b/runtest/syscalls
index c30383ee5..d43d6983b 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -334,6 +334,8 @@ fcntl37 fcntl37
 fcntl37_64 fcntl37_64
 fcntl38 fcntl38
 fcntl38_64 fcntl38_64
+fcntl39 fcntl39
+fcntl39_64 fcntl39_64
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
diff --git a/testcases/kernel/syscalls/fcntl/.gitignore b/testcases/kernel/syscalls/fcntl/.gitignore
index ede0c97b8..48b36ec34 100644
--- a/testcases/kernel/syscalls/fcntl/.gitignore
+++ b/testcases/kernel/syscalls/fcntl/.gitignore
@@ -74,3 +74,5 @@
 /fcntl37_64
 /fcntl38
 /fcntl38_64
+/fcntl39
+/fcntl39_64
diff --git a/testcases/kernel/syscalls/fcntl/fcntl39.c b/testcases/kernel/syscalls/fcntl/fcntl39.c
new file mode 100644
index 000000000..0fef20764
--- /dev/null
+++ b/testcases/kernel/syscalls/fcntl/fcntl39.c
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 CTERA Networks. All Rights Reserved.
+ *
+ * Started by Amir Goldstein <amir73il@gmail.com>
+ *
+ * DESCRIPTION
+ *     Check that dnotify DN_RENAME event is reported only on rename
+ *     inside same parent
+ */
+
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "tst_test.h"
+#include "lapi/fcntl.h"
+
+#define	TEST_DIR	"test_dir"
+#define	TEST_DIR2	"test_dir2"
+#define	TEST_FILE	"test_file"
+
+#define TEST_SIG SIGRTMIN+1
+
+static int parent_fd, subdir_fd;
+static int got_parent_event, got_subdir_event;
+
+static void dnotify_handler(int sig, siginfo_t *si, void *data __attribute__((unused)))
+{
+	if (si->si_fd == parent_fd)
+		got_parent_event = 1;
+	else if (si->si_fd == subdir_fd)
+		got_subdir_event = 1;
+	else
+		tst_brk(TBROK, "Got unexpected signal %d with si_fd %d", sig, si->si_fd);
+}
+
+static void setup_dnotify(int fd)
+{
+	struct sigaction act;
+
+	act.sa_sigaction = dnotify_handler;
+	sigemptyset(&act.sa_mask);
+	act.sa_flags = SA_SIGINFO;
+	sigaction(TEST_SIG, &act, NULL);
+
+	TEST(fcntl(fd, F_SETSIG, TEST_SIG));
+	if (TST_RET != 0) {
+		tst_brk(TBROK, "F_SETSIG failed errno = %d : %s",
+			TST_ERR, strerror(TST_ERR));
+	}
+	TEST(fcntl(fd, F_NOTIFY, DN_RENAME|DN_MULTISHOT));
+	if (TST_RET != 0) {
+		tst_brk(TBROK, "F_NOTIFY failed errno = %d : %s",
+			TST_ERR, strerror(TST_ERR));
+	}
+}
+
+static void verify_dnotify(void)
+{
+	parent_fd = SAFE_OPEN(".", O_RDONLY);
+	subdir_fd = SAFE_OPEN(TEST_DIR, O_RDONLY);
+	/* Watch renames inside ".", but not in and out of "." */
+	setup_dnotify(parent_fd);
+	/* Also watch for renames inside subdir, but not in and out of subdir */
+	setup_dnotify(subdir_fd);
+	/* Rename file from "." to subdir should not generate DN_RENAME on either */
+	tst_res(TINFO, "Testing no DN_RENAME on rename from parent to subdir");
+	SAFE_RENAME(TEST_FILE, TEST_DIR "/" TEST_FILE);
+	if (got_parent_event)
+		tst_res(TFAIL, "Got unexpected event on parent");
+	else
+		tst_res(TPASS, "No event on parent as expected");
+	if (got_subdir_event)
+		tst_res(TFAIL, "Got unexpected event on subdir");
+	else
+		tst_res(TPASS, "No event on subdir as expected");
+	/* Rename subdir itself should generate DN_RENAME on ".", but not on itself */
+	tst_res(TINFO, "Testing DN_RENAME on rename of subdir itself");
+	SAFE_RENAME(TEST_DIR, TEST_DIR2);
+	if (got_parent_event)
+		tst_res(TPASS, "Got event on parent as expected");
+	else
+		tst_res(TFAIL, "Missing event on parent");
+	if (got_subdir_event)
+		tst_res(TFAIL, "Got unexpected event on subdir");
+	else
+		tst_res(TPASS, "No event on subdir as expected");
+
+	SAFE_CLOSE(parent_fd);
+	SAFE_CLOSE(subdir_fd);
+}
+
+static void setup(void)
+{
+	SAFE_MKDIR(TEST_DIR, 00700);
+	SAFE_TOUCH(TEST_FILE, 0666, NULL);
+}
+
+static void cleanup(void)
+{
+	if (parent_fd > 0)
+		SAFE_CLOSE(parent_fd);
+	if (subdir_fd > 0)
+		SAFE_CLOSE(subdir_fd);
+}
+
+static struct tst_test test = {
+	.needs_tmpdir = 1,
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = verify_dnotify,
+	.needs_kconfigs = (const char *[]) { "CONFIG_DNOTIFY=y", NULL },
+};
-- 
2.35.1



More information about the ltp mailing list