diff mbox series

[2/2] syscalls: Add test for splicing to /dev/zero and /dev/null

Message ID 20240320095927.19973-3-chrubis@suse.cz
State Accepted
Headers show
Series Add splice tests fro /dev/{zero,null,full} | expand

Commit Message

Cyril Hrubis March 20, 2024, 9:59 a.m. UTC
Both of these devices discard written data.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 runtest/syscalls                            |  1 +
 testcases/kernel/syscalls/splice/.gitignore |  1 +
 testcases/kernel/syscalls/splice/splice09.c | 55 +++++++++++++++++++++
 3 files changed, 57 insertions(+)
 create mode 100644 testcases/kernel/syscalls/splice/splice09.c

Comments

Petr Vorel March 21, 2024, 9:33 a.m. UTC | #1
Hi Cyril,

...
> +#define _GNU_SOURCE
> +#include "tst_test.h"
> +
> +static const char *test_devices[] = {
checkpatch.pl suggests:
static const char * const test_devices[] = {

> +	"/dev/null",
> +	"/dev/zero",
> +};
> +
> +static void verify_splice(unsigned int n)
> +{
> +	char buf[1024];
> +	char dev_fd;
> +	int pipefd[2];
> +
> +	memset(buf, 0xff, sizeof(buf));
> +
> +	tst_res(TINFO, "Testing %s", test_devices[n]);
> +
> +	dev_fd = SAFE_OPEN(test_devices[n], O_WRONLY);
> +
> +	SAFE_PIPE(pipefd);
> +	SAFE_WRITE(1, pipefd[1], buf, sizeof(buf));
I wonder if write() fails, we don't get SAFE_CLOSE() calls, right?

Otherwise LGTM.

Reviewed-by: Petr Vorel <pvorel@suse.cz>

Kind regards,
Petr

> +
> +	TST_EXP_POSITIVE(splice(pipefd[0], NULL, dev_fd, NULL, sizeof(buf), 0));
> +
> +	if (TST_PASS && TST_RET != sizeof(buf))
> +		tst_res(TFAIL, "Wrote only part of the pipe buffer");
> +	else
> +		tst_res(TPASS, "Wrote whole pipe buffer");
> +
> +	SAFE_CLOSE(pipefd[0]);
> +	SAFE_CLOSE(pipefd[1]);
> +	SAFE_CLOSE(dev_fd);
> +}
> +
> +static struct tst_test test = {
> +	.test = verify_splice,
> +	.tcnt = ARRAY_SIZE(test_devices),
> +	.min_kver = "6.7",
> +};
Cyril Hrubis April 11, 2024, 10:36 a.m. UTC | #2
Hi!
> > +#define _GNU_SOURCE
> > +#include "tst_test.h"
> > +
> > +static const char *test_devices[] = {
> checkpatch.pl suggests:
> static const char * const test_devices[] = {

Will fix and push.

> > +	"/dev/null",
> > +	"/dev/zero",
> > +};
> > +
> > +static void verify_splice(unsigned int n)
> > +{
> > +	char buf[1024];
> > +	char dev_fd;
> > +	int pipefd[2];
> > +
> > +	memset(buf, 0xff, sizeof(buf));
> > +
> > +	tst_res(TINFO, "Testing %s", test_devices[n]);
> > +
> > +	dev_fd = SAFE_OPEN(test_devices[n], O_WRONLY);
> > +
> > +	SAFE_PIPE(pipefd);
> > +	SAFE_WRITE(1, pipefd[1], buf, sizeof(buf));
> I wonder if write() fails, we don't get SAFE_CLOSE() calls, right?

We do not care here since these are just pipes, the test will fail with
TBROK and kernel will destroy the pipes once the process exits.

We have to close real files in test temporary directory, because if we
do not do so, tst_rmdir() may fail on nfs. E.g. if you create a file on
nfs, open it and unlink it, the directory is not empty as one would
expect and cannot be removed.
diff mbox series

Patch

diff --git a/runtest/syscalls b/runtest/syscalls
index 0889f58a1..50bc350f0 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1518,6 +1518,7 @@  splice05 splice05
 splice06 splice06
 splice07 splice07
 splice08 splice08
+splice09 splice09
 
 tee01 tee01
 tee02 tee02
diff --git a/testcases/kernel/syscalls/splice/.gitignore b/testcases/kernel/syscalls/splice/.gitignore
index 9453cf93a..96b1727a1 100644
--- a/testcases/kernel/syscalls/splice/.gitignore
+++ b/testcases/kernel/syscalls/splice/.gitignore
@@ -6,3 +6,4 @@ 
 /splice06
 /splice07
 /splice08
+/splice09
diff --git a/testcases/kernel/syscalls/splice/splice09.c b/testcases/kernel/syscalls/splice/splice09.c
new file mode 100644
index 000000000..46f755b01
--- /dev/null
+++ b/testcases/kernel/syscalls/splice/splice09.c
@@ -0,0 +1,55 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2024 Cyril Hrubis <chrubis@suse.cz>
+ */
+
+/*\
+ * [Description]
+ *
+ * Test for splicing to /dev/zero and /dev/null these two devices discard all
+ * data written to them.
+ *
+ * The support for splicing to /dev/zero was added in:
+ * 1b057bd800c3 ("drivers/char/mem: implement splice() for /dev/zero, /dev/full")
+ */
+
+#define _GNU_SOURCE
+#include "tst_test.h"
+
+static const char *test_devices[] = {
+	"/dev/null",
+	"/dev/zero",
+};
+
+static void verify_splice(unsigned int n)
+{
+	char buf[1024];
+	char dev_fd;
+	int pipefd[2];
+
+	memset(buf, 0xff, sizeof(buf));
+
+	tst_res(TINFO, "Testing %s", test_devices[n]);
+
+	dev_fd = SAFE_OPEN(test_devices[n], O_WRONLY);
+
+	SAFE_PIPE(pipefd);
+	SAFE_WRITE(1, pipefd[1], buf, sizeof(buf));
+
+	TST_EXP_POSITIVE(splice(pipefd[0], NULL, dev_fd, NULL, sizeof(buf), 0));
+
+	if (TST_PASS && TST_RET != sizeof(buf))
+		tst_res(TFAIL, "Wrote only part of the pipe buffer");
+	else
+		tst_res(TPASS, "Wrote whole pipe buffer");
+
+	SAFE_CLOSE(pipefd[0]);
+	SAFE_CLOSE(pipefd[1]);
+	SAFE_CLOSE(dev_fd);
+}
+
+static struct tst_test test = {
+	.test = verify_splice,
+	.tcnt = ARRAY_SIZE(test_devices),
+	.min_kver = "6.7",
+};