Re: [LTP] [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test

Jan Kara
2024-01-17T14:51:00Z

On Mon 15-01-24 13:53:51, Cyril Hrubis wrote:
> We loop over all possible combinations of file descriptors in the test
> and filter out combinations that actually make sense and either block or
> attempt to copy data.
>
> The rest of invalid options produce either EINVAL or EBADF.
>
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>
> Reviewed-by: Petr Vorel <pvorel@suse.cz>

Looks good to me. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

Honza

> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/splice/.gitignore | 1 +
> testcases/kernel/syscalls/splice/splice07.c | 70 +++++++++++++++++++++
> 3 files changed, 72 insertions(+)
> create mode 100644 testcases/kernel/syscalls/splice/splice07.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 5472c954b..6e2407879 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -1516,6 +1516,7 @@ splice03 splice03
> splice04 splice04
> splice05 splice05
> splice06 splice06
> +splice07 splice07
>
> tee01 tee01
> tee02 tee02
> diff --git a/testcases/kernel/syscalls/splice/.gitignore b/testcases/kernel/syscalls/splice/.gitignore
> index 61e979ad6..88a8dff78 100644
> --- a/testcases/kernel/syscalls/splice/.gitignore
> +++ b/testcases/kernel/syscalls/splice/.gitignore
> @@ -4,3 +4,4 @@
> /splice04
> /splice05
> /splice06
> +/splice07
> diff --git a/testcases/kernel/syscalls/splice/splice07.c b/testcases/kernel/syscalls/splice/splice07.c
> new file mode 100644
> index 000000000..135c42e47
> --- /dev/null
> +++ b/testcases/kernel/syscalls/splice/splice07.c
> @@ -0,0 +1,70 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +/*
> + * Copyright (C) 2023-2024 Cyril Hrubis <chrubis@suse.cz>
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Iterate over all kinds of file descriptors and feed splice() with all possible
> + * combinations where at least one file descriptor is invalid. We do expect the
> + * syscall to fail either with EINVAL or EBADF.
> + */
> +
> +#define _GNU_SOURCE
> +
> +#include <sys/socket.h>
> +#include <netinet/in.h>
> +
> +#include "tst_test.h"
> +
> +static void check_splice(struct tst_fd *fd_in, struct tst_fd *fd_out)
> +{
> + /* These combinations just hang since the pipe is empty */
> + if (fd_in->type == TST_FD_PIPE_READ) {
> + switch (fd_out->type) {
> + case TST_FD_FILE:
> + case TST_FD_PIPE_WRITE:
> + case TST_FD_UNIX_SOCK:
> + case TST_FD_INET_SOCK:
> + case TST_FD_MEMFD:
> + return;
> + default:
> + break;
> + }
> + }
> +
> + if (fd_out->type == TST_FD_PIPE_WRITE) {
> + switch (fd_in->type) {
> + /* While these combinations succeeed */
> + case TST_FD_FILE:
> + case TST_FD_MEMFD:
> + return;
> + /* And this complains about socket not being connected */
> + case TST_FD_INET_SOCK:
> + return;
> + default:
> + break;
> + }
> + }
> +
> + const int exp_errnos[] = {EBADF, EINVAL};
> +
> + TST_EXP_FAIL2_ARR(splice(fd_in->fd, NULL, fd_out->fd, NULL, 1, 0),
> + exp_errnos, "splice() on %s -> %s",
> + tst_fd_desc(fd_in), tst_fd_desc(fd_out));
> +}
> +
> +static void verify_splice(void)
> +{
> + TST_FD_FOREACH(fd_in) {
> + tst_res(TINFO, "%s -> ...", tst_fd_desc(&fd_in));
> + TST_FD_FOREACH(fd_out)
> + check_splice(&fd_in, &fd_out);
> + }
> +}
> +
> +static struct tst_test test = {
> + .test_all = verify_splice,
> +};
> --
> 2.43.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR