diff mbox series

[v1] ioctl_fiemap01: New test for fiemap ioctl()

Message ID 20231018054357.29035-1-wegao@suse.com
State Changes Requested
Headers show
Series [v1] ioctl_fiemap01: New test for fiemap ioctl() | expand

Commit Message

Wei Gao Oct. 18, 2023, 5:43 a.m. UTC
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

Comments

Cyril Hrubis Jan. 15, 2024, 3:23 p.m. UTC | #1
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
diff mbox series

Patch

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,
+};