[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