diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2021-09-16 16:27:53 +0200 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2021-10-12 00:35:30 +0200 |
commit | 0cf482530a95d6034b6987333fdd334dcd58308f (patch) | |
tree | 9ffede8acf17bf45aba91436beedcebb1a1e55b5 | |
parent | ef2eb2e0a620363501b30360e42e70fd89ab2f60 (diff) | |
download | strace-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.c | 17 | ||||
-rw-r--r-- | src/xlat/uring_files_update_fds.in | 3 | ||||
-rw-r--r-- | tests/io_uring_register.c | 8 |
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); |