All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH v1] ioctl_fiemap01: New test for fiemap ioctl()
@ 2023-10-18  5:43 Wei Gao via ltp
  2024-01-15 15:23 ` Cyril Hrubis
  2024-01-18  7:32 ` [LTP] [PATCH v2] " Wei Gao via ltp
  0 siblings, 2 replies; 12+ messages in thread
From: Wei Gao via ltp @ 2023-10-18  5:43 UTC (permalink / raw)
  To: ltp

Fix: #535

Signed-off-by: Wei Gao <wegao@suse.com>
---
 runtest/syscalls                              |   2 +
 testcases/kernel/syscalls/ioctl/.gitignore    |   1 +
 .../kernel/syscalls/ioctl/ioctl_fiemap01.c    | 107 ++++++++++++++++++
 3 files changed, 110 insertions(+)
 create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 4152e1e5f..c7a0b2301 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -588,6 +588,8 @@ ioctl_ns07 ioctl_ns07
 
 ioctl_sg01 ioctl_sg01
 
+ioctl_fiemap01 ioctl_fiemap01
+
 inotify_init1_01 inotify_init1_01
 inotify_init1_02 inotify_init1_02
 
diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore
index 5fff7a61d..64adcdfe6 100644
--- a/testcases/kernel/syscalls/ioctl/.gitignore
+++ b/testcases/kernel/syscalls/ioctl/.gitignore
@@ -22,3 +22,4 @@
 /ioctl_ns06
 /ioctl_ns07
 /ioctl_sg01
+/ioctl_fiemap01
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
new file mode 100644
index 000000000..e0511667e
--- /dev/null
+++ b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2023 Wei Gao <wegao@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify basic fiemap ioctl
+ *
+ */
+
+#include <linux/fs.h>
+#include <linux/fiemap.h>
+#include <stdlib.h>
+
+#include "tst_test.h"
+
+#define TESTFILE "testfile"
+#define NUM_EXTENT 2
+#define FILE_OFFSET ((rand() % 8 + 2) * getpagesize())
+
+static char *buf;
+
+static void print_extens(struct fiemap *fiemap)
+{
+
+	tst_res(TINFO, "File extent count: %u", fiemap->fm_mapped_extents);
+	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
+		tst_res(TINFO, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
+				i + 1,
+				fiemap->fm_extents[i].fe_logical,
+				fiemap->fm_extents[i].fe_physical,
+				fiemap->fm_extents[i].fe_flags,
+				fiemap->fm_extents[i].fe_length);
+	}
+}
+
+static void verify_ioctl(void)
+{
+	int fd;
+	struct fiemap *fiemap;
+
+	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
+
+	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
+	fiemap->fm_start = 0;
+	fiemap->fm_length = ~0ULL;
+	fiemap->fm_extent_count = 1;
+
+	fiemap->fm_flags =  -1;
+	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
+
+	fiemap->fm_flags =  0;
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if (fiemap->fm_mapped_extents == 0)
+		tst_res(TPASS, "Check fiemap iotct step1 pass");
+
+	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, getpagesize());
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if ((fiemap->fm_mapped_extents == 1) && (fiemap->fm_extents[0].fe_physical == 0))
+		tst_res(TPASS, "Check fiemap iotct step2 pass");
+
+	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if ((fiemap->fm_extent_count == 1) &&
+		(fiemap->fm_extents[0].fe_flags == FIEMAP_EXTENT_LAST) &&
+		(fiemap->fm_extents[0].fe_physical > 0) &&
+		(fiemap->fm_extents[0].fe_length == (__u64)getpagesize()))
+		tst_res(TPASS, "Check fiemap iotct step3 pass");
+
+	fiemap->fm_extent_count = NUM_EXTENT;
+	srand(time(NULL));
+	SAFE_LSEEK(fd, FILE_OFFSET, SEEK_SET);
+	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, getpagesize());
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if ((fiemap->fm_extent_count == NUM_EXTENT) &&
+		(fiemap->fm_extents[NUM_EXTENT - 1].fe_flags == FIEMAP_EXTENT_LAST) &&
+		(fiemap->fm_extents[NUM_EXTENT - 1].fe_physical > 0) &&
+		(fiemap->fm_extents[NUM_EXTENT - 1].fe_length == (__u64)getpagesize()))
+		tst_res(TPASS, "Check fiemap iotct step4 pass");
+
+	free(fiemap);
+	close(fd);
+}
+
+static void setup(void)
+{
+	buf = SAFE_MALLOC(getpagesize());
+}
+
+static void cleanup(void)
+{
+	free(buf);
+}
+
+static struct tst_test test = {
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = verify_ioctl,
+	.needs_root = 1,
+	.needs_tmpdir = 1,
+};
-- 
2.35.3


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

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

* Re: [LTP] [PATCH v1] ioctl_fiemap01: New test for fiemap ioctl()
  2023-10-18  5:43 [LTP] [PATCH v1] ioctl_fiemap01: New test for fiemap ioctl() Wei Gao via ltp
@ 2024-01-15 15:23 ` Cyril Hrubis
  2024-01-18  7:32 ` [LTP] [PATCH v2] " Wei Gao via ltp
  1 sibling, 0 replies; 12+ messages in thread
From: Cyril Hrubis @ 2024-01-15 15:23 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi!
> +static void print_extens(struct fiemap *fiemap)
> +{
> +
> +	tst_res(TINFO, "File extent count: %u", fiemap->fm_mapped_extents);
> +	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
> +		tst_res(TINFO, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
                          ^
			  This would probably be better TDEBUG that has
			  been recently introduced.
> +				i + 1,
> +				fiemap->fm_extents[i].fe_logical,
> +				fiemap->fm_extents[i].fe_physical,
> +				fiemap->fm_extents[i].fe_flags,
> +				fiemap->fm_extents[i].fe_length);
> +	}
> +}
> +
> +static void verify_ioctl(void)
> +{
> +	int fd;
> +	struct fiemap *fiemap;
> +
> +	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
> +
> +	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
> +	fiemap->fm_start = 0;
> +	fiemap->fm_length = ~0ULL;
> +	fiemap->fm_extent_count = 1;
> +
> +	fiemap->fm_flags =  -1;
> +	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
> +
> +	fiemap->fm_flags =  0;
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
> +	if (fiemap->fm_mapped_extents == 0)
> +		tst_res(TPASS, "Check fiemap iotct step1 pass");

This is missing the TFAIL branch, also "step1 pass" is not good enough
description of the test, we should really describe what we were testing
for.

> +	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, getpagesize());
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
> +	if ((fiemap->fm_mapped_extents == 1) && (fiemap->fm_extents[0].fe_physical == 0))
> +		tst_res(TPASS, "Check fiemap iotct step2 pass");

Here as well.

> +	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
> +	if ((fiemap->fm_extent_count == 1) &&
> +		(fiemap->fm_extents[0].fe_flags == FIEMAP_EXTENT_LAST) &&
> +		(fiemap->fm_extents[0].fe_physical > 0) &&
> +		(fiemap->fm_extents[0].fe_length == (__u64)getpagesize()))
> +		tst_res(TPASS, "Check fiemap iotct step3 pass");

And here as well.

> +	fiemap->fm_extent_count = NUM_EXTENT;
> +	srand(time(NULL));
> +	SAFE_LSEEK(fd, FILE_OFFSET, SEEK_SET);
> +	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, getpagesize());
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
> +	if ((fiemap->fm_extent_count == NUM_EXTENT) &&
> +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_flags == FIEMAP_EXTENT_LAST) &&
> +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_physical > 0) &&
> +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_length == (__u64)getpagesize()))
> +		tst_res(TPASS, "Check fiemap iotct step4 pass");

And here as well.

> +	free(fiemap);
> +	close(fd);

SAFE_CLOSE() plase.

I suppose that we have to unlink the file so that the test work with -i
2.

> +}
> +
> +static void setup(void)
> +{
> +	buf = SAFE_MALLOC(getpagesize());
> +}
> +
> +static void cleanup(void)
> +{
> +	free(buf);
> +}
> +
> +static struct tst_test test = {
> +	.setup = setup,
> +	.cleanup = cleanup,
> +	.test_all = verify_ioctl,
> +	.needs_root = 1,
> +	.needs_tmpdir = 1,
> +};
> -- 
> 2.35.3
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz

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

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

* [LTP] [PATCH v2] ioctl_fiemap01: New test for fiemap ioctl()
  2023-10-18  5:43 [LTP] [PATCH v1] ioctl_fiemap01: New test for fiemap ioctl() Wei Gao via ltp
  2024-01-15 15:23 ` Cyril Hrubis
@ 2024-01-18  7:32 ` Wei Gao via ltp
  2024-02-28 17:07   ` Petr Vorel
  2024-03-31  2:17   ` [LTP] [PATCH v3] " Wei Gao via ltp
  1 sibling, 2 replies; 12+ messages in thread
From: Wei Gao via ltp @ 2024-01-18  7:32 UTC (permalink / raw)
  To: ltp

Fixes: #535

Signed-off-by: Wei Gao <wegao@suse.com>
---
 runtest/syscalls                              |   2 +
 testcases/kernel/syscalls/ioctl/.gitignore    |   1 +
 .../kernel/syscalls/ioctl/ioctl_fiemap01.c    | 116 ++++++++++++++++++
 3 files changed, 119 insertions(+)
 create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 6e2407879..4e6ce5aef 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -589,6 +589,8 @@ ioctl_ns07 ioctl_ns07
 
 ioctl_sg01 ioctl_sg01
 
+ioctl_fiemap01 ioctl_fiemap01
+
 inotify_init1_01 inotify_init1_01
 inotify_init1_02 inotify_init1_02
 
diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore
index 5fff7a61d..64adcdfe6 100644
--- a/testcases/kernel/syscalls/ioctl/.gitignore
+++ b/testcases/kernel/syscalls/ioctl/.gitignore
@@ -22,3 +22,4 @@
 /ioctl_ns06
 /ioctl_ns07
 /ioctl_sg01
+/ioctl_fiemap01
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
new file mode 100644
index 000000000..a626bb03c
--- /dev/null
+++ b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
@@ -0,0 +1,116 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2023 Wei Gao <wegao@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify basic fiemap ioctl
+ *
+ */
+
+#include <linux/fs.h>
+#include <linux/fiemap.h>
+#include <stdlib.h>
+
+#include "tst_test.h"
+
+#define TESTFILE "testfile"
+#define NUM_EXTENT 2
+#define FILE_OFFSET ((rand() % 8 + 2) * getpagesize())
+
+static char *buf;
+
+static void print_extens(struct fiemap *fiemap)
+{
+
+	tst_res(TDEBUG, "File extent count: %u", fiemap->fm_mapped_extents);
+	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
+		tst_res(TDEBUG, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
+				i + 1,
+				fiemap->fm_extents[i].fe_logical,
+				fiemap->fm_extents[i].fe_physical,
+				fiemap->fm_extents[i].fe_flags,
+				fiemap->fm_extents[i].fe_length);
+	}
+}
+
+static void verify_ioctl(void)
+{
+	int fd;
+	struct fiemap *fiemap;
+
+	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
+
+	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
+	fiemap->fm_start = 0;
+	fiemap->fm_length = ~0ULL;
+	fiemap->fm_extent_count = 1;
+
+	fiemap->fm_flags =  -1;
+	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
+
+	fiemap->fm_flags =  0;
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if (fiemap->fm_mapped_extents == 0)
+		tst_res(TPASS, "Check fiemap iotct zero fm_mapped_extents pass");
+	else
+		tst_res(TFAIL, "Check fiemap iotct zero fm_mapped_extents failed");
+
+	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, getpagesize());
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if ((fiemap->fm_mapped_extents == 1) && (fiemap->fm_extents[0].fe_physical == 0))
+		tst_res(TPASS, "Check fiemap iotct one fm_mapped_extents pass");
+	else
+		tst_res(TFAIL, "Check fiemap iotct one fm_mapped_extents failed");
+
+	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if ((fiemap->fm_mapped_extents == 1) &&
+		(fiemap->fm_extents[0].fe_flags == FIEMAP_EXTENT_LAST) &&
+		(fiemap->fm_extents[0].fe_physical > 0) &&
+		(fiemap->fm_extents[0].fe_length == (__u64)getpagesize()))
+		tst_res(TPASS, "Check fiemap iotct FIEMAP_FLAG_SYNC fm_flags pass");
+	else
+		tst_res(TFAIL, "Check fiemap iotct FIEMAP_FLAG_SYNC fm_flags failed");
+
+	fiemap->fm_extent_count = NUM_EXTENT;
+	srand(time(NULL));
+	SAFE_LSEEK(fd, FILE_OFFSET, SEEK_SET);
+	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, getpagesize());
+	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
+	print_extens(fiemap);
+	if ((fiemap->fm_mapped_extents == NUM_EXTENT) &&
+		(fiemap->fm_extents[NUM_EXTENT - 1].fe_flags == FIEMAP_EXTENT_LAST) &&
+		(fiemap->fm_extents[NUM_EXTENT - 1].fe_physical > 0) &&
+		(fiemap->fm_extents[NUM_EXTENT - 1].fe_length == (__u64)getpagesize()))
+		tst_res(TPASS, "Check fiemap iotct multiple fm_mapped_extents pass");
+	else
+		tst_res(TFAIL, "Check fiemap iotct multiple fm_mapped_extents failed");
+
+	free(fiemap);
+	SAFE_CLOSE(fd);
+	unlink(TESTFILE);
+}
+
+static void setup(void)
+{
+	buf = SAFE_MALLOC(getpagesize());
+}
+
+static void cleanup(void)
+{
+	free(buf);
+}
+
+static struct tst_test test = {
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = verify_ioctl,
+	.needs_root = 1,
+	.needs_tmpdir = 1,
+};
-- 
2.35.3


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

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

* Re: [LTP] [PATCH v2] ioctl_fiemap01: New test for fiemap ioctl()
  2024-01-18  7:32 ` [LTP] [PATCH v2] " Wei Gao via ltp
@ 2024-02-28 17:07   ` Petr Vorel
  2024-03-29  8:28     ` Wei Gao via ltp
  2024-03-31  2:17   ` [LTP] [PATCH v3] " Wei Gao via ltp
  1 sibling, 1 reply; 12+ messages in thread
From: Petr Vorel @ 2024-02-28 17:07 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi Wei,

> Fixes: #535

> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
> new file mode 100644
> index 000000000..a626bb03c
> --- /dev/null
> +++ b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
> @@ -0,0 +1,116 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2023 Wei Gao <wegao@suse.com>
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Verify basic fiemap ioctl
> + *
nit: missing space and dot at the end.
> + */
> +
> +#include <linux/fs.h>
> +#include <linux/fiemap.h>
> +#include <stdlib.h>
> +
> +#include "tst_test.h"
> +
> +#define TESTFILE "testfile"
> +#define NUM_EXTENT 2
> +#define FILE_OFFSET ((rand() % 8 + 2) * getpagesize())
> +
> +static char *buf;
> +
> +static void print_extens(struct fiemap *fiemap)
> +{
> +
nit: please no space above.
> +	tst_res(TDEBUG, "File extent count: %u", fiemap->fm_mapped_extents);
nit: please add space here (readability)
> +	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
> +		tst_res(TDEBUG, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
> +				i + 1,
> +				fiemap->fm_extents[i].fe_logical,
> +				fiemap->fm_extents[i].fe_physical,
> +				fiemap->fm_extents[i].fe_flags,
> +				fiemap->fm_extents[i].fe_length);
> +	}
> +}
> +
> +static void verify_ioctl(void)
> +{
> +	int fd;
> +	struct fiemap *fiemap;
> +
> +	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
> +
> +	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
> +	fiemap->fm_start = 0;
> +	fiemap->fm_length = ~0ULL;
> +	fiemap->fm_extent_count = 1;
> +
> +	fiemap->fm_flags =  -1;
> +	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);

I get on Tumbleweed with 6.8.0-rc4-1.g9b23bf2-default EOPNOTSUPP:
ioctl_fiemap01.c:52: TFAIL: ioctl(fd, FS_IOC_FIEMAP, fiemap) expected EBADR: EOPNOTSUPP (95)
What is the missing dependency for FS_IOC_FIEMAP? Or is there wrong fiemap use
which causes that?

> +
> +	fiemap->fm_flags =  0;
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
And on the same kernel another EOPNOTSUPP:

ioctl_fiemap01.c:55: TBROK: ioctl(3,((((2U|1U) << (((0+8)+8)+14)) | ((('f')) << (0+8)) | (((11)) << 0) | ((((sizeof(struct fiemap)))) << ((0+8)+8)))),...) failed: EOPNOTSUPP (95)
> +	print_extens(fiemap);
> +	if (fiemap->fm_mapped_extents == 0)
> +		tst_res(TPASS, "Check fiemap iotct zero fm_mapped_extents pass");
s/iotct/ioctl/

> +	else
> +		tst_res(TFAIL, "Check fiemap iotct zero fm_mapped_extents failed");
s/iotct/ioctl/
> +
> +	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, getpagesize());
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
Maybe print only on failure?
> +	if ((fiemap->fm_mapped_extents == 1) && (fiemap->fm_extents[0].fe_physical == 0))
NOTE: brackets are not needed (== has higher precedence than &&), thus:
	if (fiemap->fm_mapped_extents == 1 && fiemap->fm_extents[0].fe_physical == 0)

> +		tst_res(TPASS, "Check fiemap iotct one fm_mapped_extents pass");
s/iotct/ioctl/
> +	else
> +		tst_res(TFAIL, "Check fiemap iotct one fm_mapped_extents failed");
s/iotct/ioctl/
> +
> +	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
> +	if ((fiemap->fm_mapped_extents == 1) &&
nit: again == does not need to be in ()
> +		(fiemap->fm_extents[0].fe_flags == FIEMAP_EXTENT_LAST) &&
> +		(fiemap->fm_extents[0].fe_physical > 0) &&
> +		(fiemap->fm_extents[0].fe_length == (__u64)getpagesize()))
> +		tst_res(TPASS, "Check fiemap iotct FIEMAP_FLAG_SYNC fm_flags pass");
s/iotct/ioctl/
> +	else
> +		tst_res(TFAIL, "Check fiemap iotct FIEMAP_FLAG_SYNC fm_flags failed");
s/iotct/ioctl/
There are 4x checks, I guess instead it would be worth to write what exactly failed.

> +
> +	fiemap->fm_extent_count = NUM_EXTENT;
> +	srand(time(NULL));
> +	SAFE_LSEEK(fd, FILE_OFFSET, SEEK_SET);
> +	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, getpagesize());
> +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> +	print_extens(fiemap);
> +	if ((fiemap->fm_mapped_extents == NUM_EXTENT) &&
nit: If this check was repeated more than twice, I would put it into separate
function.
> +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_flags == FIEMAP_EXTENT_LAST) &&
> +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_physical > 0) &&
> +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_length == (__u64)getpagesize()))
> +		tst_res(TPASS, "Check fiemap iotct multiple fm_mapped_extents pass");
> +	else
> +		tst_res(TFAIL, "Check fiemap iotct multiple fm_mapped_extents failed");
> +
> +	free(fiemap);
> +	SAFE_CLOSE(fd);
> +	unlink(TESTFILE);
> +}
...

Kind regards,
Petr

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

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

* Re: [LTP] [PATCH v2] ioctl_fiemap01: New test for fiemap ioctl()
  2024-02-28 17:07   ` Petr Vorel
@ 2024-03-29  8:28     ` Wei Gao via ltp
  2024-03-29 21:32       ` Petr Vorel
  0 siblings, 1 reply; 12+ messages in thread
From: Wei Gao via ltp @ 2024-03-29  8:28 UTC (permalink / raw)
  To: Petr Vorel; +Cc: ltp

On Wed, Feb 28, 2024 at 06:07:29PM +0100, Petr Vorel wrote:
> Hi Wei,
> 
> > Fixes: #535
> 
> > diff --git a/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
> > new file mode 100644
> > index 000000000..a626bb03c
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
> > @@ -0,0 +1,116 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Copyright (c) 2023 Wei Gao <wegao@suse.com>
> > + */
> > +
> > +/*\
> > + * [Description]
> > + *
> > + * Verify basic fiemap ioctl
> > + *
> nit: missing space and dot at the end.
> > + */
> > +
> > +#include <linux/fs.h>
> > +#include <linux/fiemap.h>
> > +#include <stdlib.h>
> > +
> > +#include "tst_test.h"
> > +
> > +#define TESTFILE "testfile"
> > +#define NUM_EXTENT 2
> > +#define FILE_OFFSET ((rand() % 8 + 2) * getpagesize())
> > +
> > +static char *buf;
> > +
> > +static void print_extens(struct fiemap *fiemap)
> > +{
> > +
> nit: please no space above.
> > +	tst_res(TDEBUG, "File extent count: %u", fiemap->fm_mapped_extents);
> nit: please add space here (readability)
> > +	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
> > +		tst_res(TDEBUG, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
> > +				i + 1,
> > +				fiemap->fm_extents[i].fe_logical,
> > +				fiemap->fm_extents[i].fe_physical,
> > +				fiemap->fm_extents[i].fe_flags,
> > +				fiemap->fm_extents[i].fe_length);
> > +	}
> > +}
> > +
> > +static void verify_ioctl(void)
> > +{
> > +	int fd;
> > +	struct fiemap *fiemap;
> > +
> > +	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
> > +
> > +	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
> > +	fiemap->fm_start = 0;
> > +	fiemap->fm_length = ~0ULL;
> > +	fiemap->fm_extent_count = 1;
> > +
> > +	fiemap->fm_flags =  -1;
> > +	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
> 
> I get on Tumbleweed with 6.8.0-rc4-1.g9b23bf2-default EOPNOTSUPP:
> ioctl_fiemap01.c:52: TFAIL: ioctl(fd, FS_IOC_FIEMAP, fiemap) expected EBADR: EOPNOTSUPP (95)
> What is the missing dependency for FS_IOC_FIEMAP? Or is there wrong fiemap use
> which causes that?
Thanks for your test and i also reproduce this issue.
This is caused by Tumbleweed mount tmpfs on /tmp and tmpfs seems not support fiemap action.
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,size=494452k,nr_inodes=1048576,inode64)

I will sent new patch for cover all supported filesystem.
> 
> > +
> > +	fiemap->fm_flags =  0;
> > +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> And on the same kernel another EOPNOTSUPP:
> 
> ioctl_fiemap01.c:55: TBROK: ioctl(3,((((2U|1U) << (((0+8)+8)+14)) | ((('f')) << (0+8)) | (((11)) << 0) | ((((sizeof(struct fiemap)))) << ((0+8)+8)))),...) failed: EOPNOTSUPP (95)
> > +	print_extens(fiemap);
> > +	if (fiemap->fm_mapped_extents == 0)
> > +		tst_res(TPASS, "Check fiemap iotct zero fm_mapped_extents pass");
> s/iotct/ioctl/
> 
> > +	else
> > +		tst_res(TFAIL, "Check fiemap iotct zero fm_mapped_extents failed");
> s/iotct/ioctl/
> > +
> > +	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, getpagesize());
> > +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> > +	print_extens(fiemap);
> Maybe print only on failure?
> > +	if ((fiemap->fm_mapped_extents == 1) && (fiemap->fm_extents[0].fe_physical == 0))
> NOTE: brackets are not needed (== has higher precedence than &&), thus:
> 	if (fiemap->fm_mapped_extents == 1 && fiemap->fm_extents[0].fe_physical == 0)
> 
> > +		tst_res(TPASS, "Check fiemap iotct one fm_mapped_extents pass");
> s/iotct/ioctl/
> > +	else
> > +		tst_res(TFAIL, "Check fiemap iotct one fm_mapped_extents failed");
> s/iotct/ioctl/
> > +
> > +	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
> > +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> > +	print_extens(fiemap);
> > +	if ((fiemap->fm_mapped_extents == 1) &&
> nit: again == does not need to be in ()
> > +		(fiemap->fm_extents[0].fe_flags == FIEMAP_EXTENT_LAST) &&
> > +		(fiemap->fm_extents[0].fe_physical > 0) &&
> > +		(fiemap->fm_extents[0].fe_length == (__u64)getpagesize()))
> > +		tst_res(TPASS, "Check fiemap iotct FIEMAP_FLAG_SYNC fm_flags pass");
> s/iotct/ioctl/
> > +	else
> > +		tst_res(TFAIL, "Check fiemap iotct FIEMAP_FLAG_SYNC fm_flags failed");
> s/iotct/ioctl/
> There are 4x checks, I guess instead it would be worth to write what exactly failed.
> 
> > +
> > +	fiemap->fm_extent_count = NUM_EXTENT;
> > +	srand(time(NULL));
> > +	SAFE_LSEEK(fd, FILE_OFFSET, SEEK_SET);
> > +	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, getpagesize());
> > +	SAFE_IOCTL(fd, FS_IOC_FIEMAP, fiemap);
> > +	print_extens(fiemap);
> > +	if ((fiemap->fm_mapped_extents == NUM_EXTENT) &&
> nit: If this check was repeated more than twice, I would put it into separate
> function.
> > +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_flags == FIEMAP_EXTENT_LAST) &&
> > +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_physical > 0) &&
> > +		(fiemap->fm_extents[NUM_EXTENT - 1].fe_length == (__u64)getpagesize()))
> > +		tst_res(TPASS, "Check fiemap iotct multiple fm_mapped_extents pass");
> > +	else
> > +		tst_res(TFAIL, "Check fiemap iotct multiple fm_mapped_extents failed");
> > +
> > +	free(fiemap);
> > +	SAFE_CLOSE(fd);
> > +	unlink(TESTFILE);
> > +}
> ...
> 
> Kind regards,
> Petr

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

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

* Re: [LTP] [PATCH v2] ioctl_fiemap01: New test for fiemap ioctl()
  2024-03-29  8:28     ` Wei Gao via ltp
@ 2024-03-29 21:32       ` Petr Vorel
  2024-03-31  2:15         ` Wei Gao via ltp
  0 siblings, 1 reply; 12+ messages in thread
From: Petr Vorel @ 2024-03-29 21:32 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi Wei,

...
> > > +	fiemap->fm_flags =  -1;
> > > +	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);

> > I get on Tumbleweed with 6.8.0-rc4-1.g9b23bf2-default EOPNOTSUPP:
> > ioctl_fiemap01.c:52: TFAIL: ioctl(fd, FS_IOC_FIEMAP, fiemap) expected EBADR: EOPNOTSUPP (95)
> > What is the missing dependency for FS_IOC_FIEMAP? Or is there wrong fiemap use
> > which causes that?
> Thanks for your test and i also reproduce this issue.
> This is caused by Tumbleweed mount tmpfs on /tmp and tmpfs seems not support fiemap action.
> tmpfs on /tmp type tmpfs (rw,nosuid,nodev,size=494452k,nr_inodes=1048576,inode64)

+1. You probably knows that you need .skip_filesystems, which works even
.all_filesystems is not set.

	.skip_filesystems = (const char *const []) {
		"tmpfs",
		NULL
	},

But actually when this is filesystem dependent, I guess .all_filesystems = 1
would make sense, right?

> I will sent new patch for cover all supported filesystem.

I suppose you agree :).

Kind regards,
Petr

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

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

* Re: [LTP] [PATCH v2] ioctl_fiemap01: New test for fiemap ioctl()
  2024-03-29 21:32       ` Petr Vorel
@ 2024-03-31  2:15         ` Wei Gao via ltp
  0 siblings, 0 replies; 12+ messages in thread
From: Wei Gao via ltp @ 2024-03-31  2:15 UTC (permalink / raw)
  To: Petr Vorel; +Cc: ltp

On Fri, Mar 29, 2024 at 10:32:39PM +0100, Petr Vorel wrote:
> Hi Wei,
> 
> ...
> > > > +	fiemap->fm_flags =  -1;
> > > > +	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
> 
> > > I get on Tumbleweed with 6.8.0-rc4-1.g9b23bf2-default EOPNOTSUPP:
> > > ioctl_fiemap01.c:52: TFAIL: ioctl(fd, FS_IOC_FIEMAP, fiemap) expected EBADR: EOPNOTSUPP (95)
> > > What is the missing dependency for FS_IOC_FIEMAP? Or is there wrong fiemap use
> > > which causes that?
> > Thanks for your test and i also reproduce this issue.
> > This is caused by Tumbleweed mount tmpfs on /tmp and tmpfs seems not support fiemap action.
> > tmpfs on /tmp type tmpfs (rw,nosuid,nodev,size=494452k,nr_inodes=1048576,inode64)
> 
> +1. You probably knows that you need .skip_filesystems, which works even
> .all_filesystems is not set.
> 
> 	.skip_filesystems = (const char *const []) {
> 		"tmpfs",
> 		NULL
> 	},
> 
> But actually when this is filesystem dependent, I guess .all_filesystems = 1
> would make sense, right?
> 
> > I will sent new patch for cover all supported filesystem.
> 
> I suppose you agree :).
Sure!
New draft patch will try to cover all filesystem.

The new patch has one more thing need improve, you suggest print_extens
only on failure, when i start using TST_EXP_EXPR i can not get return result.
Any suggestion or example code handle this in clean way or we can keep 
current implementation?
NOTE: print_extens currently control by TDEBUG.

Thanks a lot :)

> 
> Kind regards,
> Petr

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

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

* [LTP] [PATCH v3] ioctl_fiemap01: New test for fiemap ioctl()
  2024-01-18  7:32 ` [LTP] [PATCH v2] " Wei Gao via ltp
  2024-02-28 17:07   ` Petr Vorel
@ 2024-03-31  2:17   ` Wei Gao via ltp
  2024-04-03  9:28     ` Petr Vorel
  2024-04-15 11:46     ` [LTP] [PATCH v4] " Wei Gao via ltp
  1 sibling, 2 replies; 12+ messages in thread
From: Wei Gao via ltp @ 2024-03-31  2:17 UTC (permalink / raw)
  To: ltp

Fixes: #535

Signed-off-by: Wei Gao <wegao@suse.com>
---
 runtest/syscalls                              |   2 +
 testcases/kernel/syscalls/ioctl/.gitignore    |   1 +
 .../kernel/syscalls/ioctl/ioctl_fiemap01.c    | 110 ++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 6e2407879..4e6ce5aef 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -589,6 +589,8 @@ ioctl_ns07 ioctl_ns07
 
 ioctl_sg01 ioctl_sg01
 
+ioctl_fiemap01 ioctl_fiemap01
+
 inotify_init1_01 inotify_init1_01
 inotify_init1_02 inotify_init1_02
 
diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore
index 5fff7a61d..64adcdfe6 100644
--- a/testcases/kernel/syscalls/ioctl/.gitignore
+++ b/testcases/kernel/syscalls/ioctl/.gitignore
@@ -22,3 +22,4 @@
 /ioctl_ns06
 /ioctl_ns07
 /ioctl_sg01
+/ioctl_fiemap01
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
new file mode 100644
index 000000000..b81842c6a
--- /dev/null
+++ b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2023 Wei Gao <wegao@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify basic fiemap ioctl.
+ */
+
+#include <linux/fs.h>
+#include <linux/fiemap.h>
+#include <stdlib.h>
+#include <sys/statvfs.h>
+
+#include "tst_test.h"
+
+#define TMPDIR "mntdir"
+#define TESTFILE "testfile"
+#define NUM_EXTENT 3
+
+static void print_extens(struct fiemap *fiemap)
+{
+	tst_res(TDEBUG, "File extent count: %u", fiemap->fm_mapped_extents);
+
+	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
+		tst_res(TDEBUG, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
+				i + 1,
+				fiemap->fm_extents[i].fe_logical,
+				fiemap->fm_extents[i].fe_physical,
+				fiemap->fm_extents[i].fe_flags,
+				fiemap->fm_extents[i].fe_length);
+	}
+}
+
+static void check_extent(struct fiemap *fiemap, unsigned int fm_mapped_extents, int index_extents, int fe_flags, unsigned int min_fe_physical, unsigned int fe_length)
+{
+	TST_EXP_EXPR(fiemap->fm_mapped_extents == fm_mapped_extents,
+		"Check extent fm_mapped_extents is %d", fm_mapped_extents);
+	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_flags & fe_flags,
+		"Check fe_flags is %d", fe_flags);
+	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_physical >= min_fe_physical,
+		"Check fe_physical > %d", min_fe_physical);
+	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_length == fe_length,
+		"Check fe_length is %d", fe_length);
+}
+
+static void verify_ioctl(void)
+{
+	int fd;
+	struct fiemap *fiemap;
+	struct statvfs fs_info;
+	unsigned long blk_size;
+
+	SAFE_CHDIR(TMPDIR);
+	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
+
+	TST_EXP_PASS(statvfs(".", &fs_info));
+
+	blk_size = fs_info.f_bsize;
+
+	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
+	fiemap->fm_start = 0;
+	fiemap->fm_length = ~0ULL;
+	fiemap->fm_extent_count = 1;
+
+	fiemap->fm_flags =  -1;
+	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
+
+	fiemap->fm_flags =  0;
+	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
+	print_extens(fiemap);
+	TST_EXP_EXPR(fiemap->fm_mapped_extents == 0,
+		"Check extent fm_mapped_extents is 0");
+
+	char *buf = SAFE_MALLOC(blk_size);
+
+	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, blk_size);
+	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
+	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
+	print_extens(fiemap);
+	check_extent(fiemap, 1, 0, FIEMAP_EXTENT_LAST, 1, blk_size);
+
+	fiemap->fm_extent_count = NUM_EXTENT;
+	SAFE_LSEEK(fd, 2 * blk_size, SEEK_SET);
+	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, blk_size);
+	SAFE_LSEEK(fd, 4 * blk_size, SEEK_SET);
+	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, blk_size);
+	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
+	print_extens(fiemap);
+	check_extent(fiemap, NUM_EXTENT, NUM_EXTENT - 1, FIEMAP_EXTENT_LAST, 1, blk_size);
+
+	free(buf);
+	free(fiemap);
+	SAFE_CLOSE(fd);
+	unlink(TESTFILE);
+}
+
+static struct tst_test test = {
+	.mount_device = 1,
+	.mntpoint = TMPDIR,
+	.all_filesystems = 1,
+	.skip_filesystems = (const char *const[]) {
+		"exfat", "vfat", "fuse", "ntfs", "tmpfs", NULL
+	},
+	.test_all = verify_ioctl,
+	.needs_root = 1,
+	.needs_tmpdir = 1,
+};
-- 
2.35.3


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

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

* Re: [LTP] [PATCH v3] ioctl_fiemap01: New test for fiemap ioctl()
  2024-03-31  2:17   ` [LTP] [PATCH v3] " Wei Gao via ltp
@ 2024-04-03  9:28     ` Petr Vorel
  2024-04-15 10:17       ` Wei Gao via ltp
  2024-04-15 11:46     ` [LTP] [PATCH v4] " Wei Gao via ltp
  1 sibling, 1 reply; 12+ messages in thread
From: Petr Vorel @ 2024-04-03  9:28 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

Hi Wei,

> +#define TMPDIR "mntdir"
very nit: We usually use MNTPOINT for .mntpoint
#define MNTPOINT   "mntpoint"

(I even tried to get rid of these defines:
https://patchwork.ozlabs.org/project/ltp/list/?series=393028 .)

> +#define TESTFILE "testfile"
> +#define NUM_EXTENT 3
> +
> +static void print_extens(struct fiemap *fiemap)
> +{
> +	tst_res(TDEBUG, "File extent count: %u", fiemap->fm_mapped_extents);
> +
> +	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
> +		tst_res(TDEBUG, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
> +				i + 1,
> +				fiemap->fm_extents[i].fe_logical,
> +				fiemap->fm_extents[i].fe_physical,
> +				fiemap->fm_extents[i].fe_flags,
> +				fiemap->fm_extents[i].fe_length);
> +	}
> +}
> +
> +static void check_extent(struct fiemap *fiemap, unsigned int fm_mapped_extents, int index_extents, int fe_flags, unsigned int min_fe_physical, unsigned int fe_length)
> +{
> +	TST_EXP_EXPR(fiemap->fm_mapped_extents == fm_mapped_extents,
> +		"Check extent fm_mapped_extents is %d", fm_mapped_extents);
nit: space here (and below) would be more readable for me.
> +	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_flags & fe_flags,
> +		"Check fe_flags is %d", fe_flags);
> +	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_physical >= min_fe_physical,
> +		"Check fe_physical > %d", min_fe_physical);
> +	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_length == fe_length,
> +		"Check fe_length is %d", fe_length);
> +}
> +
> +static void verify_ioctl(void)
> +{
> +	int fd;
> +	struct fiemap *fiemap;
> +	struct statvfs fs_info;
> +	unsigned long blk_size;
> +
> +	SAFE_CHDIR(TMPDIR);
> +	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
> +
> +	TST_EXP_PASS(statvfs(".", &fs_info));

I'd here jut use:
if (statvfs(".", &fs_info) != 0)
	tst_brk(TBROK, "statvfs failed");

Why? IMHO all TEST() and TST_EXP_PASS() should be used for the subject of
testing.

(We don't have safe_statvfs(), but it'd be needed just on 3 places.)

> +	blk_size = fs_info.f_bsize;
> +
> +	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
> +	fiemap->fm_start = 0;
> +	fiemap->fm_length = ~0ULL;
> +	fiemap->fm_extent_count = 1;
> +
> +	fiemap->fm_flags =  -1;
nit: fiemap->fm_flags = -1;

> +	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
> +
> +	fiemap->fm_flags =  0;
> +	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
> +	print_extens(fiemap);
> +	TST_EXP_EXPR(fiemap->fm_mapped_extents == 0,
> +		"Check extent fm_mapped_extents is 0");
> +
> +	char *buf = SAFE_MALLOC(blk_size);
> +
> +	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, blk_size);
> +	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
> +	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
> +	print_extens(fiemap);
> +	check_extent(fiemap, 1, 0, FIEMAP_EXTENT_LAST, 1, blk_size);
> +
> +	fiemap->fm_extent_count = NUM_EXTENT;
> +	SAFE_LSEEK(fd, 2 * blk_size, SEEK_SET);
> +	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, blk_size);
> +	SAFE_LSEEK(fd, 4 * blk_size, SEEK_SET);
> +	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, blk_size);
> +	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
> +	print_extens(fiemap);
> +	check_extent(fiemap, NUM_EXTENT, NUM_EXTENT - 1, FIEMAP_EXTENT_LAST, 1, blk_size);
> +
> +	free(buf);
> +	free(fiemap);
> +	SAFE_CLOSE(fd);
> +	unlink(TESTFILE);

SAFE_UNLINK(TESTFILE);

> +}
> +
> +static struct tst_test test = {
> +	.mount_device = 1,
> +	.mntpoint = TMPDIR,
> +	.all_filesystems = 1,
> +	.skip_filesystems = (const char *const[]) {
> +		"exfat", "vfat", "fuse", "ntfs", "tmpfs", NULL

Why do you whitelist fuse? Which filesystem under fuse does not work?

> +	},
> +	.test_all = verify_ioctl,
> +	.needs_root = 1,
> +	.needs_tmpdir = 1,
needs_tmpdir is not needed (you use .all_filesystems). You would find that when
generating docparse.

Kind regards,
Petr

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

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

* Re: [LTP] [PATCH v3] ioctl_fiemap01: New test for fiemap ioctl()
  2024-04-03  9:28     ` Petr Vorel
@ 2024-04-15 10:17       ` Wei Gao via ltp
  2024-04-15 12:17         ` Petr Vorel
  0 siblings, 1 reply; 12+ messages in thread
From: Wei Gao via ltp @ 2024-04-15 10:17 UTC (permalink / raw)
  To: Petr Vorel; +Cc: ltp

On Wed, Apr 03, 2024 at 11:28:27AM +0200, Petr Vorel wrote:
> Hi Wei,
> 
> > +static struct tst_test test = {
> > +	.mount_device = 1,
> > +	.mntpoint = TMPDIR,
> > +	.all_filesystems = 1,
> > +	.skip_filesystems = (const char *const[]) {
> > +		"exfat", "vfat", "fuse", "ntfs", "tmpfs", NULL
> 
> Why do you whitelist fuse? Which filesystem under fuse does not work?
I will remove fuse in next patch.

But i find fs_type_whitelist not contain "fuse", so this will lead 
func tst_get_supported_fs_type can not handle "fuse" filesystem, 
means add/remove "fuse" into skip_filesystems will not take any effect. 
Correct me if i have any misunderstanding.

static const char *const fs_type_whitelist[] = {
        "ext2",
        "ext3",
        "ext4",
        "xfs",
        "btrfs",
        "bcachefs",
        "vfat",
        "exfat",
        "ntfs",
        "tmpfs",
        NULL
};


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

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

* [LTP] [PATCH v4] ioctl_fiemap01: New test for fiemap ioctl()
  2024-03-31  2:17   ` [LTP] [PATCH v3] " Wei Gao via ltp
  2024-04-03  9:28     ` Petr Vorel
@ 2024-04-15 11:46     ` Wei Gao via ltp
  1 sibling, 0 replies; 12+ messages in thread
From: Wei Gao via ltp @ 2024-04-15 11:46 UTC (permalink / raw)
  To: ltp

Fixes: #535

Signed-off-by: Wei Gao <wegao@suse.com>
---
 runtest/syscalls                              |   2 +
 testcases/kernel/syscalls/ioctl/.gitignore    |   1 +
 .../kernel/syscalls/ioctl/ioctl_fiemap01.c    | 110 ++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 6e2407879..4e6ce5aef 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -589,6 +589,8 @@ ioctl_ns07 ioctl_ns07
 
 ioctl_sg01 ioctl_sg01
 
+ioctl_fiemap01 ioctl_fiemap01
+
 inotify_init1_01 inotify_init1_01
 inotify_init1_02 inotify_init1_02
 
diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore
index 5fff7a61d..64adcdfe6 100644
--- a/testcases/kernel/syscalls/ioctl/.gitignore
+++ b/testcases/kernel/syscalls/ioctl/.gitignore
@@ -22,3 +22,4 @@
 /ioctl_ns06
 /ioctl_ns07
 /ioctl_sg01
+/ioctl_fiemap01
diff --git a/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
new file mode 100644
index 000000000..1b3f80ed9
--- /dev/null
+++ b/testcases/kernel/syscalls/ioctl/ioctl_fiemap01.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2023 Wei Gao <wegao@suse.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify basic fiemap ioctl.
+ */
+
+#include <linux/fs.h>
+#include <linux/fiemap.h>
+#include <stdlib.h>
+#include <sys/statvfs.h>
+
+#include "tst_test.h"
+
+#define MNTPOINT "mntpoint"
+#define TESTFILE "testfile"
+#define NUM_EXTENT 3
+
+static void print_extens(struct fiemap *fiemap)
+{
+	tst_res(TDEBUG, "File extent count: %u", fiemap->fm_mapped_extents);
+
+	for (unsigned int i = 0; i < fiemap->fm_mapped_extents; ++i) {
+		tst_res(TDEBUG, "Extent %u: Logical offset: %llu, Physical offset: %llu, flags: %u, Length: %llu",
+				i + 1,
+				fiemap->fm_extents[i].fe_logical,
+				fiemap->fm_extents[i].fe_physical,
+				fiemap->fm_extents[i].fe_flags,
+				fiemap->fm_extents[i].fe_length);
+	}
+}
+
+static void check_extent(struct fiemap *fiemap, unsigned int fm_mapped_extents, int index_extents, int fe_flags, unsigned int min_fe_physical, unsigned int fe_length)
+{
+	TST_EXP_EXPR(fiemap->fm_mapped_extents == fm_mapped_extents,
+		"Check extent fm_mapped_extents is %d", fm_mapped_extents);
+	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_flags & fe_flags,
+		"Check fe_flags is %d", fe_flags);
+	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_physical >= min_fe_physical,
+		"Check fe_physical > %d", min_fe_physical);
+	TST_EXP_EXPR(fiemap->fm_extents[index_extents].fe_length == fe_length,
+		"Check fe_length is %d", fe_length);
+}
+
+static void verify_ioctl(void)
+{
+	int fd;
+	struct fiemap *fiemap;
+	struct statvfs fs_info;
+	unsigned long blk_size;
+
+	SAFE_CHDIR(MNTPOINT);
+	fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
+
+	if (statvfs(".", &fs_info) != 0)
+		tst_brk(TBROK, "statvfs failed");
+
+	blk_size = fs_info.f_bsize;
+
+	fiemap = SAFE_MALLOC(sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NUM_EXTENT);
+	fiemap->fm_start = 0;
+	fiemap->fm_length = ~0ULL;
+	fiemap->fm_extent_count = 1;
+
+	fiemap->fm_flags = -1;
+	TST_EXP_FAIL(ioctl(fd, FS_IOC_FIEMAP, fiemap), EBADR);
+
+	fiemap->fm_flags =  0;
+	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
+	print_extens(fiemap);
+	TST_EXP_EXPR(fiemap->fm_mapped_extents == 0,
+		"Check extent fm_mapped_extents is 0");
+
+	char *buf = SAFE_MALLOC(blk_size);
+
+	SAFE_WRITE(SAFE_WRITE_ANY, fd, buf, blk_size);
+	fiemap->fm_flags = FIEMAP_FLAG_SYNC;
+	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
+	print_extens(fiemap);
+	check_extent(fiemap, 1, 0, FIEMAP_EXTENT_LAST, 1, blk_size);
+
+	fiemap->fm_extent_count = NUM_EXTENT;
+	SAFE_LSEEK(fd, 2 * blk_size, SEEK_SET);
+	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, blk_size);
+	SAFE_LSEEK(fd, 4 * blk_size, SEEK_SET);
+	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, blk_size);
+	TST_EXP_PASS(ioctl(fd, FS_IOC_FIEMAP, fiemap));
+	print_extens(fiemap);
+	check_extent(fiemap, NUM_EXTENT, NUM_EXTENT - 1, FIEMAP_EXTENT_LAST, 1, blk_size);
+
+	free(buf);
+	free(fiemap);
+	SAFE_CLOSE(fd);
+	SAFE_UNLINK(TESTFILE);
+}
+
+static struct tst_test test = {
+	.mount_device = 1,
+	.mntpoint = MNTPOINT,
+	.all_filesystems = 1,
+	.skip_filesystems = (const char *const[]) {
+		"exfat", "vfat", "ntfs", "tmpfs", NULL
+	},
+	.test_all = verify_ioctl,
+	.needs_root = 1,
+};
-- 
2.35.3


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

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

* Re: [LTP] [PATCH v3] ioctl_fiemap01: New test for fiemap ioctl()
  2024-04-15 10:17       ` Wei Gao via ltp
@ 2024-04-15 12:17         ` Petr Vorel
  0 siblings, 0 replies; 12+ messages in thread
From: Petr Vorel @ 2024-04-15 12:17 UTC (permalink / raw)
  To: Wei Gao; +Cc: ltp

> On Wed, Apr 03, 2024 at 11:28:27AM +0200, Petr Vorel wrote:
> > Hi Wei,

> > > +static struct tst_test test = {
> > > +	.mount_device = 1,
> > > +	.mntpoint = TMPDIR,
> > > +	.all_filesystems = 1,
> > > +	.skip_filesystems = (const char *const[]) {
> > > +		"exfat", "vfat", "fuse", "ntfs", "tmpfs", NULL

> > Why do you whitelist fuse? Which filesystem under fuse does not work?
> I will remove fuse in next patch.

> But i find fs_type_whitelist not contain "fuse", so this will lead 

lib/tst_supported_fs_types.c contains:

skip_fuse = tst_fs_in_skiplist("fuse", skiplist);

=> please use it.

Kind regards,
Petr

> func tst_get_supported_fs_type can not handle "fuse" filesystem, 
> means add/remove "fuse" into skip_filesystems will not take any effect. 
> Correct me if i have any misunderstanding.

> static const char *const fs_type_whitelist[] = {
>         "ext2",
>         "ext3",
>         "ext4",
>         "xfs",
>         "btrfs",
>         "bcachefs",
>         "vfat",
>         "exfat",
>         "ntfs",
>         "tmpfs",
>         NULL
> };


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

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

end of thread, other threads:[~2024-04-15 12:18 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-18  5:43 [LTP] [PATCH v1] ioctl_fiemap01: New test for fiemap ioctl() Wei Gao via ltp
2024-01-15 15:23 ` Cyril Hrubis
2024-01-18  7:32 ` [LTP] [PATCH v2] " Wei Gao via ltp
2024-02-28 17:07   ` Petr Vorel
2024-03-29  8:28     ` Wei Gao via ltp
2024-03-29 21:32       ` Petr Vorel
2024-03-31  2:15         ` Wei Gao via ltp
2024-03-31  2:17   ` [LTP] [PATCH v3] " Wei Gao via ltp
2024-04-03  9:28     ` Petr Vorel
2024-04-15 10:17       ` Wei Gao via ltp
2024-04-15 12:17         ` Petr Vorel
2024-04-15 11:46     ` [LTP] [PATCH v4] " Wei Gao via ltp

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.