[LTP] [PATCH] name_to_handle_at: Add test cases for AT_HANDLE_FID

Jan Kara jack@suse.cz
Wed Oct 1 16:56:00 CEST 2025


Add a few testcases verifying AT_HANDLE_FID flag.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 include/lapi/fcntl.h                          |  4 +
 .../name_to_handle_at/name_to_handle_at03.c   | 88 +++++++++++++++++++
 2 files changed, 92 insertions(+)
 create mode 100644 testcases/kernel/syscalls/name_to_handle_at/name_to_handle_at03.c

This is actually a testcase for a kernel regression, the kernel fix is on the
way.

diff --git a/include/lapi/fcntl.h b/include/lapi/fcntl.h
index 7c050248892e..55a5e8b40432 100644
--- a/include/lapi/fcntl.h
+++ b/include/lapi/fcntl.h
@@ -98,6 +98,10 @@
 # define AT_HANDLE_FID		AT_REMOVEDIR
 #endif
 
+#ifndef AT_HANDLE_CONNECTABLE
+# define AT_HANDLE_CONNECTABLE	0x002
+#endif
+
 #ifndef AT_SYMLINK_FOLLOW
 # define AT_SYMLINK_FOLLOW	0x400
 #endif
diff --git a/testcases/kernel/syscalls/name_to_handle_at/name_to_handle_at03.c b/testcases/kernel/syscalls/name_to_handle_at/name_to_handle_at03.c
new file mode 100644
index 000000000000..4a6df5e46fd7
--- /dev/null
+++ b/testcases/kernel/syscalls/name_to_handle_at/name_to_handle_at03.c
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ */
+
+/*\
+ * Basic name_to_handle_at() tests.
+ *
+ * [Algorithm]
+ *  - Check that EOVERFLOW is returned as expected by name_to_handle_at().
+ *  - Check that we were able to access a file's stat with name_to_handle_at()
+ *    and open_by_handle_at().
+ */
+
+#define _GNU_SOURCE
+#include <sys/stat.h>
+#include "lapi/name_to_handle_at.h"
+
+#define TEST_FILE "test_file"
+
+static int fd_atcwd = AT_FDCWD;
+static struct file_handle *fhp;
+
+static struct tcase {
+	const char *name;
+	int *dfd;
+	const char *pathname;
+	int name_flags;
+	int exp_errno;
+} tcases[] = {
+	{"test-file", &fd_atcwd, TEST_FILE, AT_HANDLE_FID, 0},
+	{"unexportable-file", &fd_atcwd, "/proc/filesystems", AT_HANDLE_FID, 0},
+	{"test-file-connectable", &fd_atcwd, TEST_FILE, AT_HANDLE_FID | AT_HANDLE_CONNECTABLE, EINVAL},
+};
+
+static bool handle_type_supported(unsigned int flag, const char *name)
+{
+	if (name_to_handle_at(-1, ".", NULL, NULL, flag) && errno == EINVAL) {
+		tst_brk(TCONF, "%s not supported by the kernel.", name);
+		return false;
+	}
+	return true;
+}
+
+#define REQUIRE_HANDLE_TYPE_SUPPORT(flag) handle_type_supported(flag, #flag)
+
+static void setup(void)
+{
+	SAFE_TOUCH(TEST_FILE, 0600, NULL);
+	fhp = malloc(MAX_HANDLE_SZ);
+	if (!fhp)
+		tst_brk(TBROK, "malloc failed");
+
+	REQUIRE_HANDLE_TYPE_SUPPORT(AT_HANDLE_FID);
+	REQUIRE_HANDLE_TYPE_SUPPORT(AT_HANDLE_CONNECTABLE);
+}
+
+static void run(unsigned int n)
+{
+	struct tcase *tc = &tcases[n];
+	int mount_id;
+
+	fhp->handle_bytes = MAX_HANDLE_SZ;
+	TEST(name_to_handle_at(*tc->dfd, tc->pathname, fhp, &mount_id,
+			       tc->name_flags));
+	if (!tc->exp_errno) {
+		if (TST_RET)
+			tst_res(TFAIL | TTERRNO, "%s: name_to_handle_at() failed", tc->name);
+		else
+			tst_res(TPASS, "%s: name_to_handle_at() passed", tc->name);
+		return;
+	}
+
+	if (TST_RET != -1)
+		tst_res(TFAIL, "%s: name_to_handle_at() unexpectedly succeeded", tc->name);
+	else if (TST_ERR != tc->exp_errno)
+		tst_res(TFAIL | TTERRNO, "%s: name_to_handle_at() should fail with errno %s",
+			tc->name, tst_strerrno(tc->exp_errno));
+	else
+		tst_res(TPASS, "%s: name_to_handle_at() failed as expected", tc->name);
+}
+
+static struct tst_test test = {
+	.tcnt = ARRAY_SIZE(tcases),
+	.test = run,
+	.setup = setup,
+	.needs_tmpdir = 1,
+};
-- 
2.51.0



More information about the ltp mailing list