* [LTP] [PATCH v8 2/2] fstat: add test for multiple file types using fstat
2026-06-04 14:20 [LTP] [PATCH v8 1/2] open: remove O_DIRECTORY case (move to fstat test) Jinseok Kim
@ 2026-06-04 14:20 ` Jinseok Kim
2026-06-15 13:21 ` Andrea Cervesato via ltp
2026-06-04 15:09 ` [LTP] open: remove O_DIRECTORY case (move to fstat test) linuxtestproject.agent
1 sibling, 1 reply; 4+ messages in thread
From: Jinseok Kim @ 2026-06-04 14:20 UTC (permalink / raw)
To: ltp
Following review feedback, create a dedicated fstat test that verifies
S_ISREG(), S_ISDIR(), S_ISFIFO(), S_ISCHR(), S_ISBLK() on different file
types.
Signed-off-by: Jinseok Kim <always.starving0@gmail.com>
---
Changes in v8:
- Link to the man page
- Remove desc from tcase and TST_EXP_EXPR
- Link to v7: https://lore.kernel.org/ltp/20260327152751.3637-1-always.starving0@gmail.com
---
runtest/syscalls | 2 +
testcases/kernel/syscalls/fstat/.gitignore | 2 +
testcases/kernel/syscalls/fstat/fstat04.c | 103 +++++++++++++++++++++
3 files changed, 107 insertions(+)
create mode 100644 testcases/kernel/syscalls/fstat/fstat04.c
diff --git a/runtest/syscalls b/runtest/syscalls
index f790e8f84..d420df905 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -436,6 +436,8 @@ fstat02 fstat02
fstat02_64 fstat02_64
fstat03 fstat03
fstat03_64 fstat03_64
+fstat04 fstat04
+fstat04_64 fstat04_64
#fstatat64/newfstatat test cases
fstatat01 fstatat01
diff --git a/testcases/kernel/syscalls/fstat/.gitignore b/testcases/kernel/syscalls/fstat/.gitignore
index 9b1089438..a1f538f7e 100644
--- a/testcases/kernel/syscalls/fstat/.gitignore
+++ b/testcases/kernel/syscalls/fstat/.gitignore
@@ -2,3 +2,5 @@
/fstat02_64
/fstat03
/fstat03_64
+/fstat04
+/fstat04_64
diff --git a/testcases/kernel/syscalls/fstat/fstat04.c b/testcases/kernel/syscalls/fstat/fstat04.c
new file mode 100644
index 000000000..b7af04002
--- /dev/null
+++ b/testcases/kernel/syscalls/fstat/fstat04.c
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2026 Jinseok Kim <always.starving0@gmail.com>
+ */
+/*\
+ * Verify that :manpage:`fstat(2)` correctly identifies various
+ * file types.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
+#include "tst_test.h"
+
+#define MOUNT_PATH "test_mnt"
+#define REG_FILE "regfile"
+#define DIR_FILE "dirfile"
+#define FIFO_FILE "fifofile"
+#define CHR_DEV MOUNT_PATH "/chrdev"
+#define BLK_DEV MOUNT_PATH "/blkdev"
+
+static struct tcase {
+ const char *path;
+ mode_t exp_type;
+} tcases[] = {
+ { REG_FILE, S_IFREG },
+ { DIR_FILE, S_IFDIR },
+ { FIFO_FILE, S_IFIFO },
+ { CHR_DEV, S_IFCHR },
+ { BLK_DEV, S_IFBLK },
+};
+
+static void verify_fstat(unsigned int i)
+{
+ struct tcase *tc = &tcases[i];
+ struct stat buf;
+
+ int flags = O_RDONLY | O_NONBLOCK;
+
+ if (tc->exp_type == S_IFDIR)
+ flags |= O_DIRECTORY;
+
+ int fd = SAFE_OPEN(tc->path, flags);
+
+ SAFE_FSTAT(fd, &buf);
+ SAFE_CLOSE(fd);
+
+ switch (tc->exp_type) {
+ case S_IFREG:
+ TST_EXP_EXPR(S_ISREG(buf.st_mode));
+ break;
+ case S_IFDIR:
+ TST_EXP_EXPR(S_ISDIR(buf.st_mode));
+ break;
+ case S_IFIFO:
+ TST_EXP_EXPR(S_ISFIFO(buf.st_mode));
+ break;
+ case S_IFCHR:
+ TST_EXP_EXPR(S_ISCHR(buf.st_mode));
+ break;
+ case S_IFBLK:
+ TST_EXP_EXPR(S_ISBLK(buf.st_mode));
+ break;
+ }
+}
+
+static void setup(void)
+{
+ SAFE_TOUCH(REG_FILE, 0644, NULL);
+ SAFE_MKDIR(DIR_FILE, 0755);
+
+ SAFE_MKNOD(FIFO_FILE, S_IFIFO | 0777, 0);
+ SAFE_MKNOD(CHR_DEV, S_IFCHR | 0777, makedev(1, 3));
+ SAFE_MKNOD(BLK_DEV, S_IFBLK | 0777, makedev(7, 3));
+}
+
+static void cleanup(void)
+{
+ if (!access(REG_FILE, F_OK))
+ SAFE_UNLINK(REG_FILE);
+
+ if (!access(DIR_FILE, F_OK))
+ SAFE_RMDIR(DIR_FILE);
+
+ if (!access(FIFO_FILE, F_OK))
+ SAFE_UNLINK(FIFO_FILE);
+
+ if (!access(CHR_DEV, F_OK))
+ SAFE_UNLINK(CHR_DEV);
+
+ if (!access(BLK_DEV, F_OK))
+ SAFE_UNLINK(BLK_DEV);
+}
+
+static struct tst_test test = {
+ .tcnt = ARRAY_SIZE(tcases),
+ .setup = setup,
+ .cleanup = cleanup,
+ .test = verify_fstat,
+ .mntpoint = MOUNT_PATH,
+ .needs_devfs = 1,
+ .needs_tmpdir = 1,
+ .needs_root = 1,
+};
--
2.43.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [LTP] open: remove O_DIRECTORY case (move to fstat test)
2026-06-04 14:20 [LTP] [PATCH v8 1/2] open: remove O_DIRECTORY case (move to fstat test) Jinseok Kim
2026-06-04 14:20 ` [LTP] [PATCH v8 2/2] fstat: add test for multiple file types using fstat Jinseok Kim
@ 2026-06-04 15:09 ` linuxtestproject.agent
1 sibling, 0 replies; 4+ messages in thread
From: linuxtestproject.agent @ 2026-06-04 15:09 UTC (permalink / raw)
To: Jinseok Kim; +Cc: ltp
Hi Jinseok,
On Thu, 04 Jun 2026, Jinseok Kim wrote:
> open: remove O_DIRECTORY case (move to fstat test)
--- [PATCH 2/2] ---
> +/*\
> + * Verify that :manpage:`fstat(2)` correctly identifies various
> + * file types.
> + */
> + .needs_root = 1,
Ground Rule 4 requires that the reason for needing root is documented in
the test's doc comment. The test calls SAFE_MKNOD() to create block and
character device nodes, which requires CAP_MKNOD. Please add a note in
the /*\ ... */ block, e.g.:
"Requires root to create block and character device nodes with mknod(2)."
> + int flags = O_RDONLY | O_NONBLOCK;
> +
> + if (tc->exp_type == S_IFDIR)
> + flags |= O_DIRECTORY;
> +
> + int fd = SAFE_OPEN(tc->path, flags);
For the block device case (BLK_DEV, makedev(7, 3) = loop3) this will
attempt to open the underlying block device via its driver. If the loop
module is not loaded -- which can happen in containers or minimal
environments -- SAFE_OPEN aborts with TBROK rather than skipping cleanly.
The test only needs the fd to call fstat(), not to perform I/O. Using
O_PATH avoids instantiating the driver entirely and is more appropriate
for a test focused on fstat() metadata. With O_PATH the branching on
S_IFDIR also becomes unnecessary since directories can be opened without
O_DIRECTORY through an O_PATH descriptor:
int fd = SAFE_OPEN(tc->path, O_PATH | O_NOFOLLOW);
O_PATH + fstat() has been supported since Linux 3.6.
Verdict: Needs revision
---
Note:
The agent can sometimes produce false positives although often its
findings are genuine. If you find issues with the review, please
comment this email or ignore the suggestions.
Regards,
LTP AI Reviewer
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 4+ messages in thread