* [PATCH v3 0/4] Add tst_fd iterator API
@ 2024-01-15 12:53 Cyril Hrubis
2024-01-15 12:53 ` [PATCH v3 1/4] lib: Add tst_fd iterator Cyril Hrubis
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Cyril Hrubis @ 2024-01-15 12:53 UTC (permalink / raw)
To: ltp
Cc: Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel
Changes in v3:
- Made use of newly introduced API to specify an array of possible errors
Jan and Amir please check if the error sets are not missing anything
- Fixed a few minor problems as pointed out by Peter
Changes in v2:
- Changed the API into iterator rather than a funciton callback
- Added a lot more fd types
- Added splice test
Cyril Hrubis (4):
lib: Add tst_fd iterator
syscalls: readahead01: Make use of tst_fd
syscalls: accept: Add tst_fd test
syscalls: splice07: New splice tst_fd iterator test
include/tst_fd.h | 61 ++++
include/tst_test.h | 1 +
lib/tst_fd.c | 325 ++++++++++++++++++
runtest/syscalls | 2 +
testcases/kernel/syscalls/accept/.gitignore | 1 +
testcases/kernel/syscalls/accept/accept01.c | 8 -
testcases/kernel/syscalls/accept/accept03.c | 60 ++++
.../kernel/syscalls/readahead/readahead01.c | 52 +--
testcases/kernel/syscalls/splice/.gitignore | 1 +
testcases/kernel/syscalls/splice/splice07.c | 70 ++++
10 files changed, 548 insertions(+), 33 deletions(-)
create mode 100644 include/tst_fd.h
create mode 100644 lib/tst_fd.c
create mode 100644 testcases/kernel/syscalls/accept/accept03.c
create mode 100644 testcases/kernel/syscalls/splice/splice07.c
--
2.43.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/4] lib: Add tst_fd iterator
2024-01-15 12:53 [PATCH v3 0/4] Add tst_fd iterator API Cyril Hrubis
@ 2024-01-15 12:53 ` Cyril Hrubis
2024-01-15 23:09 ` [LTP] " Petr Vorel
2024-01-15 12:53 ` [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd Cyril Hrubis
` (2 subsequent siblings)
3 siblings, 1 reply; 11+ messages in thread
From: Cyril Hrubis @ 2024-01-15 12:53 UTC (permalink / raw)
To: ltp
Cc: Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe
Which allows tests to loop over different types of file descriptors
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>
---
include/tst_fd.h | 61 +++++++++
include/tst_test.h | 1 +
lib/tst_fd.c | 325 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 387 insertions(+)
create mode 100644 include/tst_fd.h
create mode 100644 lib/tst_fd.c
diff --git a/include/tst_fd.h b/include/tst_fd.h
new file mode 100644
index 000000000..2183ea068
--- /dev/null
+++ b/include/tst_fd.h
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * Copyright (C) 2023 Cyril Hrubis <chrubis@suse.cz>
+ */
+
+#ifndef TST_FD_H__
+#define TST_FD_H__
+
+enum tst_fd_type {
+ TST_FD_FILE,
+ TST_FD_PATH,
+ TST_FD_DIR,
+ TST_FD_DEV_ZERO,
+ TST_FD_PROC_MAPS,
+ TST_FD_PIPE_READ,
+ TST_FD_PIPE_WRITE,
+ TST_FD_UNIX_SOCK,
+ TST_FD_INET_SOCK,
+ TST_FD_EPOLL,
+ TST_FD_EVENTFD,
+ TST_FD_SIGNALFD,
+ TST_FD_TIMERFD,
+ TST_FD_PIDFD,
+ TST_FD_FANOTIFY,
+ TST_FD_INOTIFY,
+ TST_FD_USERFAULTFD,
+ TST_FD_PERF_EVENT,
+ TST_FD_IO_URING,
+ TST_FD_BPF_MAP,
+ TST_FD_FSOPEN,
+ TST_FD_FSPICK,
+ TST_FD_OPEN_TREE,
+ TST_FD_MEMFD,
+ TST_FD_MEMFD_SECRET,
+ TST_FD_MAX,
+};
+
+struct tst_fd {
+ enum tst_fd_type type;
+ int fd;
+ /* used by the library, do not touch! */
+ long priv;
+};
+
+#define TST_FD_INIT {.type = TST_FD_FILE, .fd = -1}
+
+/*
+ * Advances the iterator to the next fd type, returns zero at the end.
+ */
+int tst_fd_next(struct tst_fd *fd);
+
+#define TST_FD_FOREACH(fd) \
+ for (struct tst_fd fd = TST_FD_INIT; tst_fd_next(&fd); )
+
+/*
+ * Returns human readable name for the file descriptor type.
+ */
+const char *tst_fd_desc(struct tst_fd *fd);
+
+#endif /* TST_FD_H__ */
diff --git a/include/tst_test.h b/include/tst_test.h
index 0c3171e5b..fda696eeb 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -44,6 +44,7 @@
#include "tst_taint.h"
#include "tst_memutils.h"
#include "tst_arch.h"
+#include "tst_fd.h"
/*
* Reports testcase result.
diff --git a/lib/tst_fd.c b/lib/tst_fd.c
new file mode 100644
index 000000000..b0d6fb1d6
--- /dev/null
+++ b/lib/tst_fd.c
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * Copyright (C) 2023 Cyril Hrubis <chrubis@suse.cz>
+ */
+
+#define TST_NO_DEFAULT_MAIN
+
+#include <sys/epoll.h>
+#include <sys/eventfd.h>
+#include <sys/signalfd.h>
+#include <sys/timerfd.h>
+#include <sys/fanotify.h>
+#include <sys/inotify.h>
+#include <linux/perf_event.h>
+
+#include "tst_test.h"
+#include "tst_safe_macros.h"
+
+#include "lapi/pidfd.h"
+#include "lapi/io_uring.h"
+#include "lapi/bpf.h"
+#include "lapi/fsmount.h"
+
+#include "tst_fd.h"
+
+struct tst_fd_desc {
+ void (*open_fd)(struct tst_fd *fd);
+ void (*destroy)(struct tst_fd *fd);
+ const char *desc;
+};
+
+static void open_file(struct tst_fd *fd)
+{
+ fd->fd = SAFE_OPEN("fd_file", O_RDWR | O_CREAT, 0666);
+ SAFE_UNLINK("fd_file");
+}
+
+static void open_path(struct tst_fd *fd)
+{
+ int tfd;
+
+ tfd = SAFE_CREAT("fd_file", 0666);
+ SAFE_CLOSE(tfd);
+
+ fd->fd = SAFE_OPEN("fd_file", O_PATH);
+
+ SAFE_UNLINK("fd_file");
+}
+
+static void open_dir(struct tst_fd *fd)
+{
+ SAFE_MKDIR("fd_dir", 0700);
+ fd->fd = SAFE_OPEN("fd_dir", O_DIRECTORY);
+ SAFE_RMDIR("fd_dir");
+}
+
+static void open_dev_zero(struct tst_fd *fd)
+{
+ fd->fd = SAFE_OPEN("/dev/zero", O_RDONLY);
+}
+
+static void open_proc_self_maps(struct tst_fd *fd)
+{
+ fd->fd = SAFE_OPEN("/proc/self/maps", O_RDONLY);
+}
+
+static void open_pipe_read(struct tst_fd *fd)
+{
+ int pipe[2];
+
+ SAFE_PIPE(pipe);
+ fd->fd = pipe[0];
+ fd->priv = pipe[1];
+}
+
+static void open_pipe_write(struct tst_fd *fd)
+{
+ int pipe[2];
+
+ SAFE_PIPE(pipe);
+ fd->fd = pipe[1];
+ fd->priv = pipe[0];
+}
+
+static void destroy_pipe(struct tst_fd *fd)
+{
+ SAFE_CLOSE(fd->priv);
+}
+
+static void open_unix_sock(struct tst_fd *fd)
+{
+ fd->fd = SAFE_SOCKET(AF_UNIX, SOCK_STREAM, 0);
+}
+
+static void open_inet_sock(struct tst_fd *fd)
+{
+ fd->fd = SAFE_SOCKET(AF_INET, SOCK_STREAM, 0);
+}
+
+static void open_epoll(struct tst_fd *fd)
+{
+ fd->fd = epoll_create(1);
+
+ if (fd->fd < 0)
+ tst_brk(TBROK | TERRNO, "epoll_create()");
+}
+
+static void open_eventfd(struct tst_fd *fd)
+{
+ fd->fd = eventfd(0, 0);
+
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_signalfd(struct tst_fd *fd)
+{
+ sigset_t sfd_mask;
+ sigemptyset(&sfd_mask);
+
+ fd->fd = signalfd(-1, &sfd_mask, 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_timerfd(struct tst_fd *fd)
+{
+ fd->fd = timerfd_create(CLOCK_REALTIME, 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_pidfd(struct tst_fd *fd)
+{
+ fd->fd = pidfd_open(getpid(), 0);
+ if (fd->fd < 0)
+ tst_brk(TBROK | TERRNO, "pidfd_open()");
+}
+
+static void open_fanotify(struct tst_fd *fd)
+{
+ fd->fd = fanotify_init(FAN_CLASS_NOTIF, O_RDONLY);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_inotify(struct tst_fd *fd)
+{
+ fd->fd = inotify_init();
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_userfaultfd(struct tst_fd *fd)
+{
+ fd->fd = syscall(__NR_userfaultfd, 0);
+
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_perf_event(struct tst_fd *fd)
+{
+ struct perf_event_attr pe_attr = {
+ .type = PERF_TYPE_SOFTWARE,
+ .size = sizeof(struct perf_event_attr),
+ .config = PERF_COUNT_SW_CPU_CLOCK,
+ .disabled = 1,
+ .exclude_kernel = 1,
+ .exclude_hv = 1,
+ };
+
+ fd->fd = syscall(__NR_perf_event_open, &pe_attr, 0, -1, -1, 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_io_uring(struct tst_fd *fd)
+{
+ struct io_uring_params uring_params = {};
+
+ fd->fd = io_uring_setup(1, &uring_params);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_bpf_map(struct tst_fd *fd)
+{
+ union bpf_attr array_attr = {
+ .map_type = BPF_MAP_TYPE_ARRAY,
+ .key_size = 4,
+ .value_size = 8,
+ .max_entries = 1,
+ };
+
+ fd->fd = bpf(BPF_MAP_CREATE, &array_attr, sizeof(array_attr));
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_fsopen(struct tst_fd *fd)
+{
+ fd->fd = fsopen("ext2", 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_fspick(struct tst_fd *fd)
+{
+ fd->fd = fspick(AT_FDCWD, "/", 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_open_tree(struct tst_fd *fd)
+{
+ fd->fd = open_tree(AT_FDCWD, "/", 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_memfd(struct tst_fd *fd)
+{
+ fd->fd = syscall(__NR_memfd_create, "ltp_memfd", 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static void open_memfd_secret(struct tst_fd *fd)
+{
+ fd->fd = syscall(__NR_memfd_secret, 0);
+ if (fd->fd < 0) {
+ tst_res(TCONF | TERRNO,
+ "Skipping %s", tst_fd_desc(fd));
+ }
+}
+
+static struct tst_fd_desc fd_desc[] = {
+ [TST_FD_FILE] = {.open_fd = open_file, .desc = "file"},
+ [TST_FD_PATH] = {.open_fd = open_path, .desc = "O_PATH file"},
+ [TST_FD_DIR] = {.open_fd = open_dir, .desc = "directory"},
+ [TST_FD_DEV_ZERO] = {.open_fd = open_dev_zero, .desc = "/dev/zero"},
+ [TST_FD_PROC_MAPS] = {.open_fd = open_proc_self_maps, .desc = "/proc/self/maps"},
+ [TST_FD_PIPE_READ] = {.open_fd = open_pipe_read, .desc = "pipe read end", .destroy = destroy_pipe},
+ [TST_FD_PIPE_WRITE] = {.open_fd = open_pipe_write, .desc = "pipe write end", .destroy = destroy_pipe},
+ [TST_FD_UNIX_SOCK] = {.open_fd = open_unix_sock, .desc = "unix socket"},
+ [TST_FD_INET_SOCK] = {.open_fd = open_inet_sock, .desc = "inet socket"},
+ [TST_FD_EPOLL] = {.open_fd = open_epoll, .desc = "epoll"},
+ [TST_FD_EVENTFD] = {.open_fd = open_eventfd, .desc = "eventfd"},
+ [TST_FD_SIGNALFD] = {.open_fd = open_signalfd, .desc = "signalfd"},
+ [TST_FD_TIMERFD] = {.open_fd = open_timerfd, .desc = "timerfd"},
+ [TST_FD_PIDFD] = {.open_fd = open_pidfd, .desc = "pidfd"},
+ [TST_FD_FANOTIFY] = {.open_fd = open_fanotify, .desc = "fanotify"},
+ [TST_FD_INOTIFY] = {.open_fd = open_inotify, .desc = "inotify"},
+ [TST_FD_USERFAULTFD] = {.open_fd = open_userfaultfd, .desc = "userfaultfd"},
+ [TST_FD_PERF_EVENT] = {.open_fd = open_perf_event, .desc = "perf event"},
+ [TST_FD_IO_URING] = {.open_fd = open_io_uring, .desc = "io uring"},
+ [TST_FD_BPF_MAP] = {.open_fd = open_bpf_map, .desc = "bpf map"},
+ [TST_FD_FSOPEN] = {.open_fd = open_fsopen, .desc = "fsopen"},
+ [TST_FD_FSPICK] = {.open_fd = open_fspick, .desc = "fspick"},
+ [TST_FD_OPEN_TREE] = {.open_fd = open_open_tree, .desc = "open_tree"},
+ [TST_FD_MEMFD] = {.open_fd = open_memfd, .desc = "memfd"},
+ [TST_FD_MEMFD_SECRET] = {.open_fd = open_memfd_secret, .desc = "memfd secret"},
+};
+
+const char *tst_fd_desc(struct tst_fd *fd)
+{
+ if (fd->type >= ARRAY_SIZE(fd_desc))
+ return "invalid";
+
+ return fd_desc[fd->type].desc;
+}
+
+int tst_fd_next(struct tst_fd *fd)
+{
+ size_t len = ARRAY_SIZE(fd_desc);
+
+ if (fd->fd >= 0) {
+ SAFE_CLOSE(fd->fd);
+
+ if (fd_desc[fd->type].destroy)
+ fd_desc[fd->type].destroy(fd);
+
+ fd->type++;
+ }
+
+ for (;;) {
+ if (fd->type >= len)
+ return 0;
+
+ fd_desc[fd->type].open_fd(fd);
+
+ if (fd->fd >= 0)
+ return 1;
+
+ fd->type++;
+ }
+}
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd
2024-01-15 12:53 [PATCH v3 0/4] Add tst_fd iterator API Cyril Hrubis
2024-01-15 12:53 ` [PATCH v3 1/4] lib: Add tst_fd iterator Cyril Hrubis
@ 2024-01-15 12:53 ` Cyril Hrubis
2024-01-15 23:16 ` [LTP] " Petr Vorel
2024-01-17 14:49 ` Jan Kara
2024-01-15 12:53 ` [PATCH v3 3/4] syscalls: accept: Add tst_fd test Cyril Hrubis
2024-01-15 12:53 ` [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test Cyril Hrubis
3 siblings, 2 replies; 11+ messages in thread
From: Cyril Hrubis @ 2024-01-15 12:53 UTC (permalink / raw)
To: ltp
Cc: Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>
---
.../kernel/syscalls/readahead/readahead01.c | 52 ++++++++++---------
1 file changed, 27 insertions(+), 25 deletions(-)
diff --git a/testcases/kernel/syscalls/readahead/readahead01.c b/testcases/kernel/syscalls/readahead/readahead01.c
index bdef7945d..e86a73e3e 100644
--- a/testcases/kernel/syscalls/readahead/readahead01.c
+++ b/testcases/kernel/syscalls/readahead/readahead01.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2012 Linux Test Project, Inc.
+ * Copyright (C) 2023-2024 Cyril Hrubis <chrubis@suse.cz>
*/
/*\
@@ -30,43 +31,44 @@
static void test_bad_fd(void)
{
- char tempname[PATH_MAX] = "readahead01_XXXXXX";
- int fd;
+ int fd[2];
+
+ TST_EXP_FAIL(readahead(-1, 0, getpagesize()), EBADF,
+ "readahead() with fd = -1");
- tst_res(TINFO, "%s -1", __func__);
- TST_EXP_FAIL(readahead(-1, 0, getpagesize()), EBADF);
+ SAFE_PIPE(fd);
+ SAFE_CLOSE(fd[0]);
+ SAFE_CLOSE(fd[1]);
- tst_res(TINFO, "%s O_WRONLY", __func__);
- fd = mkstemp(tempname);
- if (fd == -1)
- tst_res(TFAIL | TERRNO, "mkstemp failed");
- SAFE_CLOSE(fd);
- fd = SAFE_OPEN(tempname, O_WRONLY);
- TST_EXP_FAIL(readahead(fd, 0, getpagesize()), EBADF);
- SAFE_CLOSE(fd);
- unlink(tempname);
+ TST_EXP_FAIL(readahead(fd[0], 0, getpagesize()), EBADF,
+ "readahead() with invalid fd");
}
-static void test_invalid_fd(void)
+static void test_invalid_fd(struct tst_fd *fd)
{
- int fd[2];
- tst_res(TINFO, "%s pipe", __func__);
- SAFE_PIPE(fd);
- TST_EXP_FAIL(readahead(fd[0], 0, getpagesize()), EINVAL);
- SAFE_CLOSE(fd[0]);
- SAFE_CLOSE(fd[1]);
+ switch (fd->type) {
+ /* These succeed */
+ case TST_FD_FILE:
+ case TST_FD_MEMFD:
+ case TST_FD_PROC_MAPS:
+ return;
+ default:
+ break;
+ }
- tst_res(TINFO, "%s socket", __func__);
- fd[0] = SAFE_SOCKET(AF_INET, SOCK_STREAM, 0);
- TST_EXP_FAIL(readahead(fd[0], 0, getpagesize()), EINVAL);
- SAFE_CLOSE(fd[0]);
+ int exp_errnos[] = {EBADF, EINVAL, ESPIPE};
+
+ TST_EXP_FAIL_ARR(readahead(fd->fd, 0, getpagesize()), exp_errnos,
+ "readahead() on %s", tst_fd_desc(fd));
}
static void test_readahead(void)
{
test_bad_fd();
- test_invalid_fd();
+
+ TST_FD_FOREACH(fd)
+ test_invalid_fd(&fd);
}
static void setup(void)
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 3/4] syscalls: accept: Add tst_fd test
2024-01-15 12:53 [PATCH v3 0/4] Add tst_fd iterator API Cyril Hrubis
2024-01-15 12:53 ` [PATCH v3 1/4] lib: Add tst_fd iterator Cyril Hrubis
2024-01-15 12:53 ` [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd Cyril Hrubis
@ 2024-01-15 12:53 ` Cyril Hrubis
2024-01-15 23:22 ` [LTP] " Petr Vorel
2024-01-17 14:49 ` Jan Kara
2024-01-15 12:53 ` [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test Cyril Hrubis
3 siblings, 2 replies; 11+ messages in thread
From: Cyril Hrubis @ 2024-01-15 12:53 UTC (permalink / raw)
To: ltp
Cc: Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/accept/.gitignore | 1 +
testcases/kernel/syscalls/accept/accept01.c | 8 ---
testcases/kernel/syscalls/accept/accept03.c | 60 +++++++++++++++++++++
4 files changed, 62 insertions(+), 8 deletions(-)
create mode 100644 testcases/kernel/syscalls/accept/accept03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 8216d86b0..5472c954b 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -3,6 +3,7 @@ abort01 abort01
accept01 accept01
accept02 accept02
+accept03 accept03
accept4_01 accept4_01
diff --git a/testcases/kernel/syscalls/accept/.gitignore b/testcases/kernel/syscalls/accept/.gitignore
index 5b1462699..f81d4bec9 100644
--- a/testcases/kernel/syscalls/accept/.gitignore
+++ b/testcases/kernel/syscalls/accept/.gitignore
@@ -1,2 +1,3 @@
/accept01
/accept02
+/accept03
diff --git a/testcases/kernel/syscalls/accept/accept01.c b/testcases/kernel/syscalls/accept/accept01.c
index 85af0f8af..e5db1dfec 100644
--- a/testcases/kernel/syscalls/accept/accept01.c
+++ b/testcases/kernel/syscalls/accept/accept01.c
@@ -26,7 +26,6 @@
struct sockaddr_in sin0, sin1, fsin1;
int invalid_socketfd = 400; /* anything that is not an open file */
-int devnull_fd;
int socket_fd;
int udp_fd;
@@ -45,10 +44,6 @@ static struct test_case {
(struct sockaddr *)&fsin1, sizeof(fsin1), EBADF,
"bad file descriptor"
},
- {
- PF_INET, SOCK_STREAM, 0, &devnull_fd, (struct sockaddr *)&fsin1,
- sizeof(fsin1), ENOTSOCK, "fd is not socket"
- },
{
PF_INET, SOCK_STREAM, 0, &socket_fd, (struct sockaddr *)3,
sizeof(fsin1), EINVAL, "invalid socket buffer"
@@ -73,8 +68,6 @@ static void test_setup(void)
sin0.sin_port = 0;
sin0.sin_addr.s_addr = INADDR_ANY;
- devnull_fd = SAFE_OPEN("/dev/null", O_WRONLY);
-
socket_fd = SAFE_SOCKET(PF_INET, SOCK_STREAM, 0);
SAFE_BIND(socket_fd, (struct sockaddr *)&sin0, sizeof(sin0));
@@ -88,7 +81,6 @@ static void test_setup(void)
static void test_cleanup(void)
{
- SAFE_CLOSE(devnull_fd);
SAFE_CLOSE(socket_fd);
SAFE_CLOSE(udp_fd);
}
diff --git a/testcases/kernel/syscalls/accept/accept03.c b/testcases/kernel/syscalls/accept/accept03.c
new file mode 100644
index 000000000..b85ec0d9b
--- /dev/null
+++ b/testcases/kernel/syscalls/accept/accept03.c
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * Copyright (C) 2023-2024 Cyril Hrubis <chrubis@suse.cz>
+ */
+
+/*\
+ * [Description]
+ *
+ * Verify that accept() returns ENOTSOCK or EBADF for non-socket file
+ * descriptors. The EBADF is returned in the case that the file descriptor has
+ * not a file associated with it, which is for example in the case of O_PATH
+ * opened file.
+ */
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include "tst_test.h"
+
+void check_accept(struct tst_fd *fd)
+{
+ struct sockaddr_in addr = {
+ .sin_family = AF_INET,
+ .sin_port = 0,
+ .sin_addr = {.s_addr = INADDR_ANY},
+ };
+
+ socklen_t size = sizeof(addr);
+
+ int exp_errno = ENOTSOCK;
+
+ switch (fd->type) {
+ case TST_FD_UNIX_SOCK:
+ case TST_FD_INET_SOCK:
+ return;
+ /*
+ * With these two we fail even before we get to the do_accept() because
+ * the fd does not have a struct file associated.
+ */
+ case TST_FD_OPEN_TREE:
+ case TST_FD_PATH:
+ exp_errno = EBADF;
+ default:
+ break;
+ }
+
+ TST_EXP_FAIL2(accept(fd->fd, (void*)&addr, &size),
+ exp_errno, "accept() on %s", tst_fd_desc(fd));
+}
+
+static void verify_accept(void)
+{
+ TST_FD_FOREACH(fd)
+ check_accept(&fd);
+}
+
+static struct tst_test test = {
+ .test_all = verify_accept,
+};
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test
2024-01-15 12:53 [PATCH v3 0/4] Add tst_fd iterator API Cyril Hrubis
` (2 preceding siblings ...)
2024-01-15 12:53 ` [PATCH v3 3/4] syscalls: accept: Add tst_fd test Cyril Hrubis
@ 2024-01-15 12:53 ` Cyril Hrubis
2024-01-17 14:50 ` Jan Kara
3 siblings, 1 reply; 11+ messages in thread
From: Cyril Hrubis @ 2024-01-15 12:53 UTC (permalink / raw)
To: ltp
Cc: Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe, Petr Vorel
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>
---
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
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v3 1/4] lib: Add tst_fd iterator
2024-01-15 12:53 ` [PATCH v3 1/4] lib: Add tst_fd iterator Cyril Hrubis
@ 2024-01-15 23:09 ` Petr Vorel
0 siblings, 0 replies; 11+ messages in thread
From: Petr Vorel @ 2024-01-15 23:09 UTC (permalink / raw)
To: Cyril Hrubis
Cc: ltp, mszeredi, brauner, Jan Kara, Matthew Wilcox, viro,
linux-fsdevel, Richard Palethorpe
Hi,
...
> --- /dev/null
> +++ b/lib/tst_fd.c
> @@ -0,0 +1,325 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
...
> +static void open_eventfd(struct tst_fd *fd)
> +{
> + fd->fd = eventfd(0, 0);
> +
> + if (fd->fd < 0) {
> + tst_res(TCONF | TERRNO,
very nit: this could be on single line, without brackets.
> + "Skipping %s", tst_fd_desc(fd));
> + }
> +}
> +
> +static void open_signalfd(struct tst_fd *fd)
> +{
> + sigset_t sfd_mask;
nit: space here saves checkpatch warning.
> + sigemptyset(&sfd_mask);
> +
> + fd->fd = signalfd(-1, &sfd_mask, 0);
> + if (fd->fd < 0) {
> + tst_res(TCONF | TERRNO,
> + "Skipping %s", tst_fd_desc(fd));
> + }
> +}
> +
> +static void open_timerfd(struct tst_fd *fd)
> +{
> + fd->fd = timerfd_create(CLOCK_REALTIME, 0);
> + if (fd->fd < 0) {
> + tst_res(TCONF | TERRNO,
Here as well.
> + "Skipping %s", tst_fd_desc(fd));
> + }
> +}
...
Obviously ready to merge, thanks!
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Kind regards,
Petr
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd
2024-01-15 12:53 ` [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd Cyril Hrubis
@ 2024-01-15 23:16 ` Petr Vorel
2024-01-17 14:49 ` Jan Kara
1 sibling, 0 replies; 11+ messages in thread
From: Petr Vorel @ 2024-01-15 23:16 UTC (permalink / raw)
To: Cyril Hrubis
Cc: ltp, mszeredi, brauner, Jan Kara, Matthew Wilcox, viro,
linux-fsdevel, Richard Palethorpe
Hi Cyril,
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Nice!
Kind regards,
Petr
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v3 3/4] syscalls: accept: Add tst_fd test
2024-01-15 12:53 ` [PATCH v3 3/4] syscalls: accept: Add tst_fd test Cyril Hrubis
@ 2024-01-15 23:22 ` Petr Vorel
2024-01-17 14:49 ` Jan Kara
1 sibling, 0 replies; 11+ messages in thread
From: Petr Vorel @ 2024-01-15 23:22 UTC (permalink / raw)
To: Cyril Hrubis
Cc: ltp, mszeredi, brauner, Jan Kara, Matthew Wilcox, viro,
linux-fsdevel, Richard Palethorpe
Hi Cyril, all,
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Kind regards,
Petr
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd
2024-01-15 12:53 ` [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd Cyril Hrubis
2024-01-15 23:16 ` [LTP] " Petr Vorel
@ 2024-01-17 14:49 ` Jan Kara
1 sibling, 0 replies; 11+ messages in thread
From: Jan Kara @ 2024-01-17 14:49 UTC (permalink / raw)
To: Cyril Hrubis
Cc: ltp, Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe
On Mon 15-01-24 13:53:49, Cyril Hrubis wrote:
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>
Looks good to me. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> .../kernel/syscalls/readahead/readahead01.c | 52 ++++++++++---------
> 1 file changed, 27 insertions(+), 25 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/readahead/readahead01.c b/testcases/kernel/syscalls/readahead/readahead01.c
> index bdef7945d..e86a73e3e 100644
> --- a/testcases/kernel/syscalls/readahead/readahead01.c
> +++ b/testcases/kernel/syscalls/readahead/readahead01.c
> @@ -1,6 +1,7 @@
> // SPDX-License-Identifier: GPL-2.0
> /*
> * Copyright (C) 2012 Linux Test Project, Inc.
> + * Copyright (C) 2023-2024 Cyril Hrubis <chrubis@suse.cz>
> */
>
> /*\
> @@ -30,43 +31,44 @@
>
> static void test_bad_fd(void)
> {
> - char tempname[PATH_MAX] = "readahead01_XXXXXX";
> - int fd;
> + int fd[2];
> +
> + TST_EXP_FAIL(readahead(-1, 0, getpagesize()), EBADF,
> + "readahead() with fd = -1");
>
> - tst_res(TINFO, "%s -1", __func__);
> - TST_EXP_FAIL(readahead(-1, 0, getpagesize()), EBADF);
> + SAFE_PIPE(fd);
> + SAFE_CLOSE(fd[0]);
> + SAFE_CLOSE(fd[1]);
>
> - tst_res(TINFO, "%s O_WRONLY", __func__);
> - fd = mkstemp(tempname);
> - if (fd == -1)
> - tst_res(TFAIL | TERRNO, "mkstemp failed");
> - SAFE_CLOSE(fd);
> - fd = SAFE_OPEN(tempname, O_WRONLY);
> - TST_EXP_FAIL(readahead(fd, 0, getpagesize()), EBADF);
> - SAFE_CLOSE(fd);
> - unlink(tempname);
> + TST_EXP_FAIL(readahead(fd[0], 0, getpagesize()), EBADF,
> + "readahead() with invalid fd");
> }
>
> -static void test_invalid_fd(void)
> +static void test_invalid_fd(struct tst_fd *fd)
> {
> - int fd[2];
>
> - tst_res(TINFO, "%s pipe", __func__);
> - SAFE_PIPE(fd);
> - TST_EXP_FAIL(readahead(fd[0], 0, getpagesize()), EINVAL);
> - SAFE_CLOSE(fd[0]);
> - SAFE_CLOSE(fd[1]);
> + switch (fd->type) {
> + /* These succeed */
> + case TST_FD_FILE:
> + case TST_FD_MEMFD:
> + case TST_FD_PROC_MAPS:
> + return;
> + default:
> + break;
> + }
>
> - tst_res(TINFO, "%s socket", __func__);
> - fd[0] = SAFE_SOCKET(AF_INET, SOCK_STREAM, 0);
> - TST_EXP_FAIL(readahead(fd[0], 0, getpagesize()), EINVAL);
> - SAFE_CLOSE(fd[0]);
> + int exp_errnos[] = {EBADF, EINVAL, ESPIPE};
> +
> + TST_EXP_FAIL_ARR(readahead(fd->fd, 0, getpagesize()), exp_errnos,
> + "readahead() on %s", tst_fd_desc(fd));
> }
>
> static void test_readahead(void)
> {
> test_bad_fd();
> - test_invalid_fd();
> +
> + TST_FD_FOREACH(fd)
> + test_invalid_fd(&fd);
> }
>
> static void setup(void)
> --
> 2.43.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/4] syscalls: accept: Add tst_fd test
2024-01-15 12:53 ` [PATCH v3 3/4] syscalls: accept: Add tst_fd test Cyril Hrubis
2024-01-15 23:22 ` [LTP] " Petr Vorel
@ 2024-01-17 14:49 ` Jan Kara
1 sibling, 0 replies; 11+ messages in thread
From: Jan Kara @ 2024-01-17 14:49 UTC (permalink / raw)
To: Cyril Hrubis
Cc: ltp, Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe
On Mon 15-01-24 13:53:50, Cyril Hrubis wrote:
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>
Makes sense to me. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/accept/.gitignore | 1 +
> testcases/kernel/syscalls/accept/accept01.c | 8 ---
> testcases/kernel/syscalls/accept/accept03.c | 60 +++++++++++++++++++++
> 4 files changed, 62 insertions(+), 8 deletions(-)
> create mode 100644 testcases/kernel/syscalls/accept/accept03.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 8216d86b0..5472c954b 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -3,6 +3,7 @@ abort01 abort01
>
> accept01 accept01
> accept02 accept02
> +accept03 accept03
>
> accept4_01 accept4_01
>
> diff --git a/testcases/kernel/syscalls/accept/.gitignore b/testcases/kernel/syscalls/accept/.gitignore
> index 5b1462699..f81d4bec9 100644
> --- a/testcases/kernel/syscalls/accept/.gitignore
> +++ b/testcases/kernel/syscalls/accept/.gitignore
> @@ -1,2 +1,3 @@
> /accept01
> /accept02
> +/accept03
> diff --git a/testcases/kernel/syscalls/accept/accept01.c b/testcases/kernel/syscalls/accept/accept01.c
> index 85af0f8af..e5db1dfec 100644
> --- a/testcases/kernel/syscalls/accept/accept01.c
> +++ b/testcases/kernel/syscalls/accept/accept01.c
> @@ -26,7 +26,6 @@
> struct sockaddr_in sin0, sin1, fsin1;
>
> int invalid_socketfd = 400; /* anything that is not an open file */
> -int devnull_fd;
> int socket_fd;
> int udp_fd;
>
> @@ -45,10 +44,6 @@ static struct test_case {
> (struct sockaddr *)&fsin1, sizeof(fsin1), EBADF,
> "bad file descriptor"
> },
> - {
> - PF_INET, SOCK_STREAM, 0, &devnull_fd, (struct sockaddr *)&fsin1,
> - sizeof(fsin1), ENOTSOCK, "fd is not socket"
> - },
> {
> PF_INET, SOCK_STREAM, 0, &socket_fd, (struct sockaddr *)3,
> sizeof(fsin1), EINVAL, "invalid socket buffer"
> @@ -73,8 +68,6 @@ static void test_setup(void)
> sin0.sin_port = 0;
> sin0.sin_addr.s_addr = INADDR_ANY;
>
> - devnull_fd = SAFE_OPEN("/dev/null", O_WRONLY);
> -
> socket_fd = SAFE_SOCKET(PF_INET, SOCK_STREAM, 0);
> SAFE_BIND(socket_fd, (struct sockaddr *)&sin0, sizeof(sin0));
>
> @@ -88,7 +81,6 @@ static void test_setup(void)
>
> static void test_cleanup(void)
> {
> - SAFE_CLOSE(devnull_fd);
> SAFE_CLOSE(socket_fd);
> SAFE_CLOSE(udp_fd);
> }
> diff --git a/testcases/kernel/syscalls/accept/accept03.c b/testcases/kernel/syscalls/accept/accept03.c
> new file mode 100644
> index 000000000..b85ec0d9b
> --- /dev/null
> +++ b/testcases/kernel/syscalls/accept/accept03.c
> @@ -0,0 +1,60 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +/*
> + * Copyright (C) 2023-2024 Cyril Hrubis <chrubis@suse.cz>
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Verify that accept() returns ENOTSOCK or EBADF for non-socket file
> + * descriptors. The EBADF is returned in the case that the file descriptor has
> + * not a file associated with it, which is for example in the case of O_PATH
> + * opened file.
> + */
> +
> +#include <sys/socket.h>
> +#include <netinet/in.h>
> +
> +#include "tst_test.h"
> +
> +void check_accept(struct tst_fd *fd)
> +{
> + struct sockaddr_in addr = {
> + .sin_family = AF_INET,
> + .sin_port = 0,
> + .sin_addr = {.s_addr = INADDR_ANY},
> + };
> +
> + socklen_t size = sizeof(addr);
> +
> + int exp_errno = ENOTSOCK;
> +
> + switch (fd->type) {
> + case TST_FD_UNIX_SOCK:
> + case TST_FD_INET_SOCK:
> + return;
> + /*
> + * With these two we fail even before we get to the do_accept() because
> + * the fd does not have a struct file associated.
> + */
> + case TST_FD_OPEN_TREE:
> + case TST_FD_PATH:
> + exp_errno = EBADF;
> + default:
> + break;
> + }
> +
> + TST_EXP_FAIL2(accept(fd->fd, (void*)&addr, &size),
> + exp_errno, "accept() on %s", tst_fd_desc(fd));
> +}
> +
> +static void verify_accept(void)
> +{
> + TST_FD_FOREACH(fd)
> + check_accept(&fd);
> +}
> +
> +static struct tst_test test = {
> + .test_all = verify_accept,
> +};
> --
> 2.43.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test
2024-01-15 12:53 ` [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test Cyril Hrubis
@ 2024-01-17 14:50 ` Jan Kara
0 siblings, 0 replies; 11+ messages in thread
From: Jan Kara @ 2024-01-17 14:50 UTC (permalink / raw)
To: Cyril Hrubis
Cc: ltp, Matthew Wilcox, amir73il, mszeredi, brauner, viro, Jan Kara,
linux-fsdevel, Richard Palethorpe, Petr Vorel
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
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2024-01-17 14:50 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-15 12:53 [PATCH v3 0/4] Add tst_fd iterator API Cyril Hrubis
2024-01-15 12:53 ` [PATCH v3 1/4] lib: Add tst_fd iterator Cyril Hrubis
2024-01-15 23:09 ` [LTP] " Petr Vorel
2024-01-15 12:53 ` [PATCH v3 2/4] syscalls: readahead01: Make use of tst_fd Cyril Hrubis
2024-01-15 23:16 ` [LTP] " Petr Vorel
2024-01-17 14:49 ` Jan Kara
2024-01-15 12:53 ` [PATCH v3 3/4] syscalls: accept: Add tst_fd test Cyril Hrubis
2024-01-15 23:22 ` [LTP] " Petr Vorel
2024-01-17 14:49 ` Jan Kara
2024-01-15 12:53 ` [PATCH v3 4/4] syscalls: splice07: New splice tst_fd iterator test Cyril Hrubis
2024-01-17 14:50 ` Jan Kara
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).