summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2021-09-16 16:27:53 +0200
committerEugene Syromyatnikov <evgsyr@gmail.com>2021-10-12 00:35:30 +0200
commit0cf482530a95d6034b6987333fdd334dcd58308f (patch)
tree9ffede8acf17bf45aba91436beedcebb1a1e55b5
parentef2eb2e0a620363501b30360e42e70fd89ab2f60 (diff)
downloadstrace-0cf482530a95d6034b6987333fdd334dcd58308f.tar.gz
io_uring: decode IORING_REGISTER_FILES_SKIP in IORING_REGISTER_FILES_UPDATE
Introduced by Linux commit v5.12~270^2~95. * src/xlat/uring_files_update_fds.in: New file. * src/io_uring.c (print_files_update_array_member): New function. (print_io_uring_files_update): Use print_files_update_array_member instead of print_fd_array_member. * tests/io_uring_register.c: Add checks for printing of fds -1, -2, -3.
-rw-r--r--src/io_uring.c17
-rw-r--r--src/xlat/uring_files_update_fds.in3
-rw-r--r--tests/io_uring_register.c8
3 files changed, 24 insertions, 4 deletions
diff --git a/src/io_uring.c b/src/io_uring.c
index ea8e5bea4..67c2d3d5a 100644
--- a/src/io_uring.c
+++ b/src/io_uring.c
@@ -12,6 +12,7 @@
#include "xlat/uring_cqring_flags.h"
#include "xlat/uring_enter_flags.h"
+#include "xlat/uring_files_update_fds.h"
#include "xlat/uring_op_flags.h"
#include "xlat/uring_ops.h"
#include "xlat/uring_setup_features.h"
@@ -167,6 +168,20 @@ SYS_FUNC(io_uring_enter)
return RVAL_DECODED;
}
+static bool
+print_files_update_array_member(struct tcb *tcp, void *elem_buf,
+ size_t elem_size, void *data)
+{
+ int fd = *(int *) elem_buf;
+
+ if (fd < -1)
+ printxval_d(uring_files_update_fds, fd, NULL);
+ else
+ printfd(tcp, fd);
+
+ return true;
+}
+
static void
print_io_uring_files_update(struct tcb *tcp, const kernel_ulong_t addr,
const unsigned int nargs)
@@ -187,7 +202,7 @@ print_io_uring_files_update(struct tcb *tcp, const kernel_ulong_t addr,
tprints_field_name("fds");
print_big_u64_addr(arg.fds);
print_array(tcp, arg.fds, nargs, &buf, sizeof(buf),
- tfetch_mem, print_fd_array_member, NULL);
+ tfetch_mem, print_files_update_array_member, NULL);
tprint_struct_end();
}
diff --git a/src/xlat/uring_files_update_fds.in b/src/xlat/uring_files_update_fds.in
new file mode 100644
index 000000000..c238df2b8
--- /dev/null
+++ b/src/xlat/uring_files_update_fds.in
@@ -0,0 +1,3 @@
+#unconditional
+#val_type int
+IORING_REGISTER_FILES_SKIP
diff --git a/tests/io_uring_register.c b/tests/io_uring_register.c
index 5475a0460..ba050087b 100644
--- a/tests/io_uring_register.c
+++ b/tests/io_uring_register.c
@@ -76,7 +76,7 @@ main(void)
if (fd_full < 0)
perror_msg_and_fail("open: %s", path_full);
- int fds[] = { fd_full, fd_null };
+ int fds[] = { fd_full, fd_null, -1, -2, -3 };
const int *arg_fds = tail_memdup(fds, sizeof(fds));
@@ -143,7 +143,7 @@ main(void)
sys_io_uring_register(fd_null, fd_arr_ops[i].op, arg_fds,
ARRAY_SIZE(fds));
printf("io_uring_register(%u<%s>, " XLAT_FMT
- ", [%u<%s>, %u<%s>], %u) = %s\n",
+ ", [%u<%s>, %u<%s>, -1, -2, -3], %u) = %s\n",
fd_null, path_null,
XLAT_SEL(fd_arr_ops[i].op, fd_arr_ops[i].str),
fd_full, path_full, fd_null, path_null,
@@ -178,7 +178,9 @@ main(void)
sys_io_uring_register(fd_null, 6, &iufu, ARRAY_SIZE(fds));
printf("io_uring_register(%u<%s>, "
XLAT_KNOWN(0x6, "IORING_REGISTER_FILES_UPDATE")
- ", {offset=3735929054, fds=[%u<%s>, %u<%s>]}, %u) = %s\n",
+ ", {offset=3735929054, fds=[%u<%s>, %u<%s>, -1, "
+ XLAT_KNOWN(-2, "IORING_REGISTER_FILES_SKIP")
+ ", -3]}, %u) = %s\n",
fd_null, path_null, fd_full, path_full, fd_null, path_null,
(unsigned int) ARRAY_SIZE(fds), errstr);