All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH v8 1/2] open: remove O_DIRECTORY case (move to fstat test)
@ 2026-06-04 14:20 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 ` [LTP] open: remove O_DIRECTORY case (move to fstat test) linuxtestproject.agent
  0 siblings, 2 replies; 4+ messages in thread
From: Jinseok Kim @ 2026-06-04 14:20 UTC (permalink / raw)
  To: ltp

The O_DIRECTORY test case was mostly verifying fstat() behavior on an
existing directory rather than testing any specific open() behavior.

Following review suggestion, remove it from open01.c. A separate fstat
test will be added in a follow-up patch to cover file type checks
(S_ISDIR, etc.) more comprehensively.

Signed-off-by: Jinseok Kim <always.starving0@gmail.com>
---
 testcases/kernel/syscalls/open/open01.c | 13 +------------
 1 file changed, 1 insertion(+), 12 deletions(-)

diff --git a/testcases/kernel/syscalls/open/open01.c b/testcases/kernel/syscalls/open/open01.c
index 1cefb4790..1413ccdec 100644
--- a/testcases/kernel/syscalls/open/open01.c
+++ b/testcases/kernel/syscalls/open/open01.c
@@ -6,15 +6,12 @@
  */

 /*\
- * Basic :manpage:`open(2)` test, checking sticky/directory bit.
+ * Basic :manpage:`open(2)` test, checking sticky bit.
  *
  * 1. Open a new file with O_CREAT, fstat.st_mode should not have the
  *    01000 (S_ISVTX) bit on. In Linux, the save text bit is *NOT* cleared.
- * 2. Open a new directory with O_DIRECTORY, fstat.st_mode should have the
- *    040000 (S_IFDIR) bit on.
  */

-#define _GNU_SOURCE		/* for O_DIRECTORY */
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -22,7 +19,6 @@
 #include "tst_test.h"

 #define TEST_FILE	"testfile"
-#define TEST_DIR	"testdir"

 static int fd;

@@ -34,7 +30,6 @@ static struct tcase {
 	char *desc;
 } tcases[] = {
 	{TEST_FILE, O_RDWR | O_CREAT, 01444, S_ISVTX, "sticky bit"},
-	{TEST_DIR, O_DIRECTORY, 0, S_IFDIR, "directory bit"}
 };

 static void verify_open(unsigned int n)
@@ -60,11 +55,6 @@ static void verify_open(unsigned int n)
 		SAFE_UNLINK(tc->filename);
 }

-static void setup(void)
-{
-	SAFE_MKDIR(TEST_DIR, 0755);
-}
-
 static void cleanup(void)
 {
 	if (fd > 0)
@@ -74,7 +64,6 @@ static void cleanup(void)
 static struct tst_test test = {
 	.tcnt = ARRAY_SIZE(tcases),
 	.needs_tmpdir = 1,
-	.setup = setup,
 	.cleanup = cleanup,
 	.test = verify_open,
 };
--
2.43.0

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [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

* Re: [LTP] [PATCH v8 2/2] fstat: add test for multiple file types using fstat
  2026-06-04 14:20 ` [LTP] [PATCH v8 2/2] fstat: add test for multiple file types using fstat Jinseok Kim
@ 2026-06-15 13:21   ` Andrea Cervesato via ltp
  0 siblings, 0 replies; 4+ messages in thread
From: Andrea Cervesato via ltp @ 2026-06-15 13:21 UTC (permalink / raw)
  To: Jinseok Kim; +Cc: ltp

Hi Jinseok,

> +	int flags = O_RDONLY | O_NONBLOCK;

consider using O_PATH instead of O_RDONLY | O_NONBLOCK for device
nodes. fstat() works correctly on O_PATH file descriptors and returns
the right st_mode, without needing the underlying driver to be
present. Please use it in the SAFE_OPEN().

> +
> +	if (tc->exp_type == S_IFDIR)
> +		flags |= O_DIRECTORY;
> +
> +	int fd = SAFE_OPEN(tc->path, flags);

The test does not gate on CONFIG_BLK_DEV_LOOP via .needs_kconfigs,
so SAFE_OPEN will TBROK on systems without loop support.

Regards,
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-06-15 13:22 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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-15 13:21   ` Andrea Cervesato via ltp
2026-06-04 15:09 ` [LTP] open: remove O_DIRECTORY case (move to fstat test) linuxtestproject.agent

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.