Message ID | 20240320095927.19973-3-chrubis@suse.cz |
---|---|
State | Accepted |
Headers | show |
Series | Add splice tests fro /dev/{zero,null,full} | expand |
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", > +};
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 --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", +};
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