1d9b57aa3SJens Axboe // SPDX-License-Identifier: GPL-2.0 2d9b57aa3SJens Axboe /* 3d9b57aa3SJens Axboe * io_uring opcode handling table 4d9b57aa3SJens Axboe */ 5d9b57aa3SJens Axboe #include <linux/kernel.h> 6d9b57aa3SJens Axboe #include <linux/errno.h> 7d9b57aa3SJens Axboe #include <linux/fs.h> 8d9b57aa3SJens Axboe #include <linux/file.h> 9d9b57aa3SJens Axboe #include <linux/io_uring.h> 10dadf03cfSJens Axboe #include <linux/io_uring/cmd.h> 11d9b57aa3SJens Axboe 12d9b57aa3SJens Axboe #include "io_uring.h" 13d9b57aa3SJens Axboe #include "opdef.h" 14d9b57aa3SJens Axboe #include "refs.h" 15d9b57aa3SJens Axboe #include "tctx.h" 16d9b57aa3SJens Axboe #include "sqpoll.h" 17d9b57aa3SJens Axboe #include "fdinfo.h" 18d9b57aa3SJens Axboe #include "kbuf.h" 19d9b57aa3SJens Axboe #include "rsrc.h" 20d9b57aa3SJens Axboe 21d9b57aa3SJens Axboe #include "xattr.h" 22d9b57aa3SJens Axboe #include "nop.h" 23d9b57aa3SJens Axboe #include "fs.h" 24d9b57aa3SJens Axboe #include "splice.h" 25d9b57aa3SJens Axboe #include "sync.h" 26d9b57aa3SJens Axboe #include "advise.h" 27d9b57aa3SJens Axboe #include "openclose.h" 28d9b57aa3SJens Axboe #include "uring_cmd.h" 29d9b57aa3SJens Axboe #include "epoll.h" 30d9b57aa3SJens Axboe #include "statx.h" 31d9b57aa3SJens Axboe #include "net.h" 32d9b57aa3SJens Axboe #include "msg_ring.h" 33d9b57aa3SJens Axboe #include "timeout.h" 34d9b57aa3SJens Axboe #include "poll.h" 35d9b57aa3SJens Axboe #include "cancel.h" 36d9b57aa3SJens Axboe #include "rw.h" 37f31ecf67SJens Axboe #include "waitid.h" 38194bb58cSJens Axboe #include "futex.h" 39b4bb1900STony Solomonik #include "truncate.h" 4011ed914bSDavid Wei #include "zcrx.h" 41d9b57aa3SJens Axboe 42d9b57aa3SJens Axboe static int io_no_issue(struct io_kiocb *req, unsigned int issue_flags) 43d9b57aa3SJens Axboe { 44d9b57aa3SJens Axboe WARN_ON_ONCE(1); 45d9b57aa3SJens Axboe return -ECANCELED; 46d9b57aa3SJens Axboe } 47d9b57aa3SJens Axboe 48d9b57aa3SJens Axboe static __maybe_unused int io_eopnotsupp_prep(struct io_kiocb *kiocb, 49d9b57aa3SJens Axboe const struct io_uring_sqe *sqe) 50d9b57aa3SJens Axboe { 51d9b57aa3SJens Axboe return -EOPNOTSUPP; 52d9b57aa3SJens Axboe } 53d9b57aa3SJens Axboe 54a7dd2782SBreno Leitao const struct io_issue_def io_issue_defs[] = { 55d9b57aa3SJens Axboe [IORING_OP_NOP] = { 56d9b57aa3SJens Axboe .audit_skip = 1, 57d9b57aa3SJens Axboe .iopoll = 1, 58d9b57aa3SJens Axboe .prep = io_nop_prep, 59d9b57aa3SJens Axboe .issue = io_nop, 60d9b57aa3SJens Axboe }, 61d9b57aa3SJens Axboe [IORING_OP_READV] = { 62d9b57aa3SJens Axboe .needs_file = 1, 63d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 64d9b57aa3SJens Axboe .pollin = 1, 65d9b57aa3SJens Axboe .buffer_select = 1, 66d9b57aa3SJens Axboe .plug = 1, 67d9b57aa3SJens Axboe .audit_skip = 1, 68d9b57aa3SJens Axboe .ioprio = 1, 69d9b57aa3SJens Axboe .iopoll = 1, 70ef0ec1adSPavel Begunkov .iopoll_queue = 1, 71d2d778fbSJens Axboe .vectored = 1, 72e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 73a9165b83SJens Axboe .prep = io_prep_readv, 74d9b57aa3SJens Axboe .issue = io_read, 75d9b57aa3SJens Axboe }, 76d9b57aa3SJens Axboe [IORING_OP_WRITEV] = { 77d9b57aa3SJens Axboe .needs_file = 1, 78d9b57aa3SJens Axboe .hash_reg_file = 1, 79d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 80d9b57aa3SJens Axboe .pollout = 1, 81d9b57aa3SJens Axboe .plug = 1, 82d9b57aa3SJens Axboe .audit_skip = 1, 83d9b57aa3SJens Axboe .ioprio = 1, 84d9b57aa3SJens Axboe .iopoll = 1, 85ef0ec1adSPavel Begunkov .iopoll_queue = 1, 86d2d778fbSJens Axboe .vectored = 1, 87e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 88a9165b83SJens Axboe .prep = io_prep_writev, 89d9b57aa3SJens Axboe .issue = io_write, 90d9b57aa3SJens Axboe }, 91d9b57aa3SJens Axboe [IORING_OP_FSYNC] = { 92d9b57aa3SJens Axboe .needs_file = 1, 93d9b57aa3SJens Axboe .audit_skip = 1, 94d9b57aa3SJens Axboe .prep = io_fsync_prep, 95d9b57aa3SJens Axboe .issue = io_fsync, 96d9b57aa3SJens Axboe }, 97d9b57aa3SJens Axboe [IORING_OP_READ_FIXED] = { 98d9b57aa3SJens Axboe .needs_file = 1, 99d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 100d9b57aa3SJens Axboe .pollin = 1, 101d9b57aa3SJens Axboe .plug = 1, 102d9b57aa3SJens Axboe .audit_skip = 1, 103d9b57aa3SJens Axboe .ioprio = 1, 104d9b57aa3SJens Axboe .iopoll = 1, 105ef0ec1adSPavel Begunkov .iopoll_queue = 1, 106e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 107a9165b83SJens Axboe .prep = io_prep_read_fixed, 108ff92d824SKeith Busch .issue = io_read_fixed, 109d9b57aa3SJens Axboe }, 110d9b57aa3SJens Axboe [IORING_OP_WRITE_FIXED] = { 111d9b57aa3SJens Axboe .needs_file = 1, 112d9b57aa3SJens Axboe .hash_reg_file = 1, 113d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 114d9b57aa3SJens Axboe .pollout = 1, 115d9b57aa3SJens Axboe .plug = 1, 116d9b57aa3SJens Axboe .audit_skip = 1, 117d9b57aa3SJens Axboe .ioprio = 1, 118d9b57aa3SJens Axboe .iopoll = 1, 119ef0ec1adSPavel Begunkov .iopoll_queue = 1, 120e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 121a9165b83SJens Axboe .prep = io_prep_write_fixed, 122ff92d824SKeith Busch .issue = io_write_fixed, 123d9b57aa3SJens Axboe }, 124d9b57aa3SJens Axboe [IORING_OP_POLL_ADD] = { 125d9b57aa3SJens Axboe .needs_file = 1, 126d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 127d9b57aa3SJens Axboe .audit_skip = 1, 128d9b57aa3SJens Axboe .prep = io_poll_add_prep, 129d9b57aa3SJens Axboe .issue = io_poll_add, 130d9b57aa3SJens Axboe }, 131d9b57aa3SJens Axboe [IORING_OP_POLL_REMOVE] = { 132d9b57aa3SJens Axboe .audit_skip = 1, 133d9b57aa3SJens Axboe .prep = io_poll_remove_prep, 134d9b57aa3SJens Axboe .issue = io_poll_remove, 135d9b57aa3SJens Axboe }, 136d9b57aa3SJens Axboe [IORING_OP_SYNC_FILE_RANGE] = { 137d9b57aa3SJens Axboe .needs_file = 1, 138d9b57aa3SJens Axboe .audit_skip = 1, 139d9b57aa3SJens Axboe .prep = io_sfr_prep, 140d9b57aa3SJens Axboe .issue = io_sync_file_range, 141d9b57aa3SJens Axboe }, 142d9b57aa3SJens Axboe [IORING_OP_SENDMSG] = { 143d9b57aa3SJens Axboe .needs_file = 1, 144d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 145d9b57aa3SJens Axboe .pollout = 1, 146d9b57aa3SJens Axboe .ioprio = 1, 147d9b57aa3SJens Axboe #if defined(CONFIG_NET) 148e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 149d9b57aa3SJens Axboe .prep = io_sendmsg_prep, 150d9b57aa3SJens Axboe .issue = io_sendmsg, 151d9b57aa3SJens Axboe #else 152d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 153d9b57aa3SJens Axboe #endif 154d9b57aa3SJens Axboe }, 155d9b57aa3SJens Axboe [IORING_OP_RECVMSG] = { 156d9b57aa3SJens Axboe .needs_file = 1, 157d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 158d9b57aa3SJens Axboe .pollin = 1, 159d9b57aa3SJens Axboe .buffer_select = 1, 160d9b57aa3SJens Axboe .ioprio = 1, 161d9b57aa3SJens Axboe #if defined(CONFIG_NET) 162e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 163d9b57aa3SJens Axboe .prep = io_recvmsg_prep, 164d9b57aa3SJens Axboe .issue = io_recvmsg, 165d9b57aa3SJens Axboe #else 166d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 167d9b57aa3SJens Axboe #endif 168d9b57aa3SJens Axboe }, 169d9b57aa3SJens Axboe [IORING_OP_TIMEOUT] = { 170d9b57aa3SJens Axboe .audit_skip = 1, 171e10677a8SJens Axboe .async_size = sizeof(struct io_timeout_data), 172d9b57aa3SJens Axboe .prep = io_timeout_prep, 173d9b57aa3SJens Axboe .issue = io_timeout, 174d9b57aa3SJens Axboe }, 175d9b57aa3SJens Axboe [IORING_OP_TIMEOUT_REMOVE] = { 176d9b57aa3SJens Axboe /* used by timeout updates' prep() */ 177d9b57aa3SJens Axboe .audit_skip = 1, 178d9b57aa3SJens Axboe .prep = io_timeout_remove_prep, 179d9b57aa3SJens Axboe .issue = io_timeout_remove, 180d9b57aa3SJens Axboe }, 181d9b57aa3SJens Axboe [IORING_OP_ACCEPT] = { 182d9b57aa3SJens Axboe .needs_file = 1, 183d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 184d9b57aa3SJens Axboe .pollin = 1, 185d9b57aa3SJens Axboe .poll_exclusive = 1, 186d9b57aa3SJens Axboe .ioprio = 1, /* used for flags */ 187d9b57aa3SJens Axboe #if defined(CONFIG_NET) 188d9b57aa3SJens Axboe .prep = io_accept_prep, 189d9b57aa3SJens Axboe .issue = io_accept, 190d9b57aa3SJens Axboe #else 191d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 192d9b57aa3SJens Axboe #endif 193d9b57aa3SJens Axboe }, 194d9b57aa3SJens Axboe [IORING_OP_ASYNC_CANCEL] = { 195d9b57aa3SJens Axboe .audit_skip = 1, 196d9b57aa3SJens Axboe .prep = io_async_cancel_prep, 197d9b57aa3SJens Axboe .issue = io_async_cancel, 198d9b57aa3SJens Axboe }, 199d9b57aa3SJens Axboe [IORING_OP_LINK_TIMEOUT] = { 200d9b57aa3SJens Axboe .audit_skip = 1, 201e10677a8SJens Axboe .async_size = sizeof(struct io_timeout_data), 202d9b57aa3SJens Axboe .prep = io_link_timeout_prep, 203d9b57aa3SJens Axboe .issue = io_no_issue, 204d9b57aa3SJens Axboe }, 205d9b57aa3SJens Axboe [IORING_OP_CONNECT] = { 206d9b57aa3SJens Axboe .needs_file = 1, 207d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 208d9b57aa3SJens Axboe .pollout = 1, 209d9b57aa3SJens Axboe #if defined(CONFIG_NET) 210e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 211d9b57aa3SJens Axboe .prep = io_connect_prep, 212d9b57aa3SJens Axboe .issue = io_connect, 213d9b57aa3SJens Axboe #else 214d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 215d9b57aa3SJens Axboe #endif 216d9b57aa3SJens Axboe }, 217d9b57aa3SJens Axboe [IORING_OP_FALLOCATE] = { 218d9b57aa3SJens Axboe .needs_file = 1, 219d9b57aa3SJens Axboe .prep = io_fallocate_prep, 220d9b57aa3SJens Axboe .issue = io_fallocate, 221d9b57aa3SJens Axboe }, 222d9b57aa3SJens Axboe [IORING_OP_OPENAT] = { 223d9b57aa3SJens Axboe .prep = io_openat_prep, 224d9b57aa3SJens Axboe .issue = io_openat, 225d9b57aa3SJens Axboe }, 226d9b57aa3SJens Axboe [IORING_OP_CLOSE] = { 227d9b57aa3SJens Axboe .prep = io_close_prep, 228d9b57aa3SJens Axboe .issue = io_close, 229d9b57aa3SJens Axboe }, 230d9808cebSPavel Begunkov [IORING_OP_FILES_UPDATE] = { 231d9b57aa3SJens Axboe .audit_skip = 1, 232d9b57aa3SJens Axboe .iopoll = 1, 233d9808cebSPavel Begunkov .prep = io_files_update_prep, 234d9808cebSPavel Begunkov .issue = io_files_update, 235d9b57aa3SJens Axboe }, 236d9b57aa3SJens Axboe [IORING_OP_STATX] = { 237d9b57aa3SJens Axboe .audit_skip = 1, 238d9b57aa3SJens Axboe .prep = io_statx_prep, 239d9b57aa3SJens Axboe .issue = io_statx, 240d9b57aa3SJens Axboe }, 241d9b57aa3SJens Axboe [IORING_OP_READ] = { 242d9b57aa3SJens Axboe .needs_file = 1, 243d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 244d9b57aa3SJens Axboe .pollin = 1, 245d9b57aa3SJens Axboe .buffer_select = 1, 246d9b57aa3SJens Axboe .plug = 1, 247d9b57aa3SJens Axboe .audit_skip = 1, 248d9b57aa3SJens Axboe .ioprio = 1, 249d9b57aa3SJens Axboe .iopoll = 1, 250ef0ec1adSPavel Begunkov .iopoll_queue = 1, 251e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 252a9165b83SJens Axboe .prep = io_prep_read, 253d9b57aa3SJens Axboe .issue = io_read, 254d9b57aa3SJens Axboe }, 255d9b57aa3SJens Axboe [IORING_OP_WRITE] = { 256d9b57aa3SJens Axboe .needs_file = 1, 257d9b57aa3SJens Axboe .hash_reg_file = 1, 258d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 259d9b57aa3SJens Axboe .pollout = 1, 260d9b57aa3SJens Axboe .plug = 1, 261d9b57aa3SJens Axboe .audit_skip = 1, 262d9b57aa3SJens Axboe .ioprio = 1, 263d9b57aa3SJens Axboe .iopoll = 1, 264ef0ec1adSPavel Begunkov .iopoll_queue = 1, 265e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 266a9165b83SJens Axboe .prep = io_prep_write, 267d9b57aa3SJens Axboe .issue = io_write, 268d9b57aa3SJens Axboe }, 269d9b57aa3SJens Axboe [IORING_OP_FADVISE] = { 270d9b57aa3SJens Axboe .needs_file = 1, 271d9b57aa3SJens Axboe .audit_skip = 1, 272d9b57aa3SJens Axboe .prep = io_fadvise_prep, 273d9b57aa3SJens Axboe .issue = io_fadvise, 274d9b57aa3SJens Axboe }, 275d9b57aa3SJens Axboe [IORING_OP_MADVISE] = { 276fbe870a7SRichard Guy Briggs .audit_skip = 1, 277d9b57aa3SJens Axboe .prep = io_madvise_prep, 278d9b57aa3SJens Axboe .issue = io_madvise, 279d9b57aa3SJens Axboe }, 280d9b57aa3SJens Axboe [IORING_OP_SEND] = { 281d9b57aa3SJens Axboe .needs_file = 1, 282d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 283d9b57aa3SJens Axboe .pollout = 1, 284d9b57aa3SJens Axboe .audit_skip = 1, 285d9b57aa3SJens Axboe .ioprio = 1, 286ac5f71a3SJens Axboe .buffer_select = 1, 287d9b57aa3SJens Axboe #if defined(CONFIG_NET) 288e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 289d9b57aa3SJens Axboe .prep = io_sendmsg_prep, 290d9b57aa3SJens Axboe .issue = io_send, 291d9b57aa3SJens Axboe #else 292d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 293d9b57aa3SJens Axboe #endif 294d9b57aa3SJens Axboe }, 295d9b57aa3SJens Axboe [IORING_OP_RECV] = { 296d9b57aa3SJens Axboe .needs_file = 1, 297d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 298d9b57aa3SJens Axboe .pollin = 1, 299d9b57aa3SJens Axboe .buffer_select = 1, 300d9b57aa3SJens Axboe .audit_skip = 1, 301d9b57aa3SJens Axboe .ioprio = 1, 302d9b57aa3SJens Axboe #if defined(CONFIG_NET) 303e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 304d9b57aa3SJens Axboe .prep = io_recvmsg_prep, 305d9b57aa3SJens Axboe .issue = io_recv, 306d9b57aa3SJens Axboe #else 307d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 308d9b57aa3SJens Axboe #endif 309d9b57aa3SJens Axboe }, 310d9b57aa3SJens Axboe [IORING_OP_OPENAT2] = { 311d9b57aa3SJens Axboe .prep = io_openat2_prep, 312d9b57aa3SJens Axboe .issue = io_openat2, 313d9b57aa3SJens Axboe }, 314d9b57aa3SJens Axboe [IORING_OP_EPOLL_CTL] = { 315d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 316d9b57aa3SJens Axboe .audit_skip = 1, 317d9b57aa3SJens Axboe #if defined(CONFIG_EPOLL) 318d9b57aa3SJens Axboe .prep = io_epoll_ctl_prep, 319d9b57aa3SJens Axboe .issue = io_epoll_ctl, 320d9b57aa3SJens Axboe #else 321d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 322d9b57aa3SJens Axboe #endif 323d9b57aa3SJens Axboe }, 324d9b57aa3SJens Axboe [IORING_OP_SPLICE] = { 325d9b57aa3SJens Axboe .needs_file = 1, 326d9b57aa3SJens Axboe .hash_reg_file = 1, 327d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 328d9b57aa3SJens Axboe .audit_skip = 1, 329d9b57aa3SJens Axboe .prep = io_splice_prep, 330d9b57aa3SJens Axboe .issue = io_splice, 331d9b57aa3SJens Axboe }, 332d9b57aa3SJens Axboe [IORING_OP_PROVIDE_BUFFERS] = { 333d9b57aa3SJens Axboe .audit_skip = 1, 334d9b57aa3SJens Axboe .iopoll = 1, 335d9b57aa3SJens Axboe .prep = io_provide_buffers_prep, 336d9b57aa3SJens Axboe .issue = io_provide_buffers, 337d9b57aa3SJens Axboe }, 338d9b57aa3SJens Axboe [IORING_OP_REMOVE_BUFFERS] = { 339d9b57aa3SJens Axboe .audit_skip = 1, 340d9b57aa3SJens Axboe .iopoll = 1, 341d9b57aa3SJens Axboe .prep = io_remove_buffers_prep, 342d9b57aa3SJens Axboe .issue = io_remove_buffers, 343d9b57aa3SJens Axboe }, 344d9b57aa3SJens Axboe [IORING_OP_TEE] = { 345d9b57aa3SJens Axboe .needs_file = 1, 346d9b57aa3SJens Axboe .hash_reg_file = 1, 347d9b57aa3SJens Axboe .unbound_nonreg_file = 1, 348d9b57aa3SJens Axboe .audit_skip = 1, 349d9b57aa3SJens Axboe .prep = io_tee_prep, 350d9b57aa3SJens Axboe .issue = io_tee, 351d9b57aa3SJens Axboe }, 352d9b57aa3SJens Axboe [IORING_OP_SHUTDOWN] = { 353d9b57aa3SJens Axboe .needs_file = 1, 354d9b57aa3SJens Axboe #if defined(CONFIG_NET) 355d9b57aa3SJens Axboe .prep = io_shutdown_prep, 356d9b57aa3SJens Axboe .issue = io_shutdown, 357d9b57aa3SJens Axboe #else 358d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 359d9b57aa3SJens Axboe #endif 360d9b57aa3SJens Axboe }, 361d9b57aa3SJens Axboe [IORING_OP_RENAMEAT] = { 362d9b57aa3SJens Axboe .prep = io_renameat_prep, 363d9b57aa3SJens Axboe .issue = io_renameat, 364d9b57aa3SJens Axboe }, 365d9b57aa3SJens Axboe [IORING_OP_UNLINKAT] = { 366d9b57aa3SJens Axboe .prep = io_unlinkat_prep, 367d9b57aa3SJens Axboe .issue = io_unlinkat, 368d9b57aa3SJens Axboe }, 369d9b57aa3SJens Axboe [IORING_OP_MKDIRAT] = { 370d9b57aa3SJens Axboe .prep = io_mkdirat_prep, 371d9b57aa3SJens Axboe .issue = io_mkdirat, 372d9b57aa3SJens Axboe }, 373d9b57aa3SJens Axboe [IORING_OP_SYMLINKAT] = { 374d9b57aa3SJens Axboe .prep = io_symlinkat_prep, 375d9b57aa3SJens Axboe .issue = io_symlinkat, 376d9b57aa3SJens Axboe }, 377d9b57aa3SJens Axboe [IORING_OP_LINKAT] = { 378d9b57aa3SJens Axboe .prep = io_linkat_prep, 379d9b57aa3SJens Axboe .issue = io_linkat, 380d9b57aa3SJens Axboe }, 381d9b57aa3SJens Axboe [IORING_OP_MSG_RING] = { 382d9b57aa3SJens Axboe .needs_file = 1, 383d9b57aa3SJens Axboe .iopoll = 1, 384d9b57aa3SJens Axboe .prep = io_msg_ring_prep, 385d9b57aa3SJens Axboe .issue = io_msg_ring, 386d9b57aa3SJens Axboe }, 387d9b57aa3SJens Axboe [IORING_OP_FSETXATTR] = { 388d9b57aa3SJens Axboe .needs_file = 1, 389d9b57aa3SJens Axboe .prep = io_fsetxattr_prep, 390d9b57aa3SJens Axboe .issue = io_fsetxattr, 391d9b57aa3SJens Axboe }, 392d9b57aa3SJens Axboe [IORING_OP_SETXATTR] = { 393d9b57aa3SJens Axboe .prep = io_setxattr_prep, 394d9b57aa3SJens Axboe .issue = io_setxattr, 395d9b57aa3SJens Axboe }, 396d9b57aa3SJens Axboe [IORING_OP_FGETXATTR] = { 397d9b57aa3SJens Axboe .needs_file = 1, 398d9b57aa3SJens Axboe .prep = io_fgetxattr_prep, 399d9b57aa3SJens Axboe .issue = io_fgetxattr, 400d9b57aa3SJens Axboe }, 401d9b57aa3SJens Axboe [IORING_OP_GETXATTR] = { 402d9b57aa3SJens Axboe .prep = io_getxattr_prep, 403d9b57aa3SJens Axboe .issue = io_getxattr, 404d9b57aa3SJens Axboe }, 405d9b57aa3SJens Axboe [IORING_OP_SOCKET] = { 406d9b57aa3SJens Axboe .audit_skip = 1, 407d9b57aa3SJens Axboe #if defined(CONFIG_NET) 408d9b57aa3SJens Axboe .prep = io_socket_prep, 409d9b57aa3SJens Axboe .issue = io_socket, 410d9b57aa3SJens Axboe #else 411d9b57aa3SJens Axboe .prep = io_eopnotsupp_prep, 412d9b57aa3SJens Axboe #endif 413d9b57aa3SJens Axboe }, 414d9b57aa3SJens Axboe [IORING_OP_URING_CMD] = { 415d9b57aa3SJens Axboe .needs_file = 1, 416d9b57aa3SJens Axboe .plug = 1, 4175756a3a7SKanchan Joshi .iopoll = 1, 418ef0ec1adSPavel Begunkov .iopoll_queue = 1, 4195f14404bSPavel Begunkov .async_size = sizeof(struct io_async_cmd), 420d9b57aa3SJens Axboe .prep = io_uring_cmd_prep, 421d9b57aa3SJens Axboe .issue = io_uring_cmd, 422d9b57aa3SJens Axboe }, 423b48c312bSPavel Begunkov [IORING_OP_SEND_ZC] = { 42406a5464bSPavel Begunkov .needs_file = 1, 42506a5464bSPavel Begunkov .unbound_nonreg_file = 1, 42606a5464bSPavel Begunkov .pollout = 1, 42706a5464bSPavel Begunkov .audit_skip = 1, 42806a5464bSPavel Begunkov .ioprio = 1, 42906a5464bSPavel Begunkov #if defined(CONFIG_NET) 430e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 431b0e9b551SPavel Begunkov .prep = io_send_zc_prep, 432b0e9b551SPavel Begunkov .issue = io_send_zc, 43306a5464bSPavel Begunkov #else 43406a5464bSPavel Begunkov .prep = io_eopnotsupp_prep, 43506a5464bSPavel Begunkov #endif 43606a5464bSPavel Begunkov }, 437493108d9SPavel Begunkov [IORING_OP_SENDMSG_ZC] = { 438493108d9SPavel Begunkov .needs_file = 1, 439493108d9SPavel Begunkov .unbound_nonreg_file = 1, 440493108d9SPavel Begunkov .pollout = 1, 441493108d9SPavel Begunkov .ioprio = 1, 442493108d9SPavel Begunkov #if defined(CONFIG_NET) 443e10677a8SJens Axboe .async_size = sizeof(struct io_async_msghdr), 444493108d9SPavel Begunkov .prep = io_send_zc_prep, 445493108d9SPavel Begunkov .issue = io_sendmsg_zc, 446f30bd4d0SBreno Leitao #else 447f30bd4d0SBreno Leitao .prep = io_eopnotsupp_prep, 448f30bd4d0SBreno Leitao #endif 449f30bd4d0SBreno Leitao }, 450fc68fcdaSJens Axboe [IORING_OP_READ_MULTISHOT] = { 451fc68fcdaSJens Axboe .needs_file = 1, 452fc68fcdaSJens Axboe .unbound_nonreg_file = 1, 453fc68fcdaSJens Axboe .pollin = 1, 454fc68fcdaSJens Axboe .buffer_select = 1, 455fc68fcdaSJens Axboe .audit_skip = 1, 456e10677a8SJens Axboe .async_size = sizeof(struct io_async_rw), 457fc68fcdaSJens Axboe .prep = io_read_mshot_prep, 458fc68fcdaSJens Axboe .issue = io_read_mshot, 459fc68fcdaSJens Axboe }, 460f31ecf67SJens Axboe [IORING_OP_WAITID] = { 461e10677a8SJens Axboe .async_size = sizeof(struct io_waitid_async), 462f31ecf67SJens Axboe .prep = io_waitid_prep, 463f31ecf67SJens Axboe .issue = io_waitid, 464f31ecf67SJens Axboe }, 465194bb58cSJens Axboe [IORING_OP_FUTEX_WAIT] = { 466194bb58cSJens Axboe #if defined(CONFIG_FUTEX) 467194bb58cSJens Axboe .prep = io_futex_prep, 468194bb58cSJens Axboe .issue = io_futex_wait, 469194bb58cSJens Axboe #else 470194bb58cSJens Axboe .prep = io_eopnotsupp_prep, 471194bb58cSJens Axboe #endif 472194bb58cSJens Axboe }, 473194bb58cSJens Axboe [IORING_OP_FUTEX_WAKE] = { 474194bb58cSJens Axboe #if defined(CONFIG_FUTEX) 475194bb58cSJens Axboe .prep = io_futex_prep, 476194bb58cSJens Axboe .issue = io_futex_wake, 477194bb58cSJens Axboe #else 478194bb58cSJens Axboe .prep = io_eopnotsupp_prep, 479194bb58cSJens Axboe #endif 480194bb58cSJens Axboe }, 4818f350194SJens Axboe [IORING_OP_FUTEX_WAITV] = { 4828f350194SJens Axboe #if defined(CONFIG_FUTEX) 4838f350194SJens Axboe .prep = io_futexv_prep, 4848f350194SJens Axboe .issue = io_futexv_wait, 4858f350194SJens Axboe #else 4868f350194SJens Axboe .prep = io_eopnotsupp_prep, 4878f350194SJens Axboe #endif 4888f350194SJens Axboe }, 489dc18b89aSJens Axboe [IORING_OP_FIXED_FD_INSTALL] = { 490dc18b89aSJens Axboe .needs_file = 1, 491dc18b89aSJens Axboe .prep = io_install_fixed_fd_prep, 492dc18b89aSJens Axboe .issue = io_install_fixed_fd, 493dc18b89aSJens Axboe }, 494b4bb1900STony Solomonik [IORING_OP_FTRUNCATE] = { 495b4bb1900STony Solomonik .needs_file = 1, 496b4bb1900STony Solomonik .hash_reg_file = 1, 497b4bb1900STony Solomonik .prep = io_ftruncate_prep, 498b4bb1900STony Solomonik .issue = io_ftruncate, 499b4bb1900STony Solomonik }, 5007481fd93SGabriel Krisman Bertazi [IORING_OP_BIND] = { 5017481fd93SGabriel Krisman Bertazi #if defined(CONFIG_NET) 5027481fd93SGabriel Krisman Bertazi .needs_file = 1, 5037481fd93SGabriel Krisman Bertazi .prep = io_bind_prep, 5047481fd93SGabriel Krisman Bertazi .issue = io_bind, 5057481fd93SGabriel Krisman Bertazi .async_size = sizeof(struct io_async_msghdr), 5067481fd93SGabriel Krisman Bertazi #else 5077481fd93SGabriel Krisman Bertazi .prep = io_eopnotsupp_prep, 5087481fd93SGabriel Krisman Bertazi #endif 5097481fd93SGabriel Krisman Bertazi }, 510ff140cc8SGabriel Krisman Bertazi [IORING_OP_LISTEN] = { 511ff140cc8SGabriel Krisman Bertazi #if defined(CONFIG_NET) 512ff140cc8SGabriel Krisman Bertazi .needs_file = 1, 513ff140cc8SGabriel Krisman Bertazi .prep = io_listen_prep, 514ff140cc8SGabriel Krisman Bertazi .issue = io_listen, 515ff140cc8SGabriel Krisman Bertazi .async_size = sizeof(struct io_async_msghdr), 516ff140cc8SGabriel Krisman Bertazi #else 517ff140cc8SGabriel Krisman Bertazi .prep = io_eopnotsupp_prep, 518ff140cc8SGabriel Krisman Bertazi #endif 519ff140cc8SGabriel Krisman Bertazi }, 52011ed914bSDavid Wei [IORING_OP_RECV_ZC] = { 52111ed914bSDavid Wei .needs_file = 1, 52211ed914bSDavid Wei .unbound_nonreg_file = 1, 52311ed914bSDavid Wei .pollin = 1, 52411ed914bSDavid Wei .ioprio = 1, 52511ed914bSDavid Wei #if defined(CONFIG_NET) 52611ed914bSDavid Wei .prep = io_recvzc_prep, 52711ed914bSDavid Wei .issue = io_recvzc, 52811ed914bSDavid Wei #else 52911ed914bSDavid Wei .prep = io_eopnotsupp_prep, 53011ed914bSDavid Wei #endif 53111ed914bSDavid Wei }, 53219f7e942SJens Axboe [IORING_OP_EPOLL_WAIT] = { 53319f7e942SJens Axboe .needs_file = 1, 53419f7e942SJens Axboe .audit_skip = 1, 53519f7e942SJens Axboe .pollin = 1, 53619f7e942SJens Axboe #if defined(CONFIG_EPOLL) 53719f7e942SJens Axboe .prep = io_epoll_wait_prep, 53819f7e942SJens Axboe .issue = io_epoll_wait, 53919f7e942SJens Axboe #else 54019f7e942SJens Axboe .prep = io_eopnotsupp_prep, 54119f7e942SJens Axboe #endif 54219f7e942SJens Axboe }, 543bdabba04SPavel Begunkov [IORING_OP_READV_FIXED] = { 544bdabba04SPavel Begunkov .needs_file = 1, 545bdabba04SPavel Begunkov .unbound_nonreg_file = 1, 546bdabba04SPavel Begunkov .pollin = 1, 547bdabba04SPavel Begunkov .plug = 1, 548bdabba04SPavel Begunkov .audit_skip = 1, 549bdabba04SPavel Begunkov .ioprio = 1, 550bdabba04SPavel Begunkov .iopoll = 1, 551bdabba04SPavel Begunkov .iopoll_queue = 1, 552bdabba04SPavel Begunkov .vectored = 1, 553bdabba04SPavel Begunkov .async_size = sizeof(struct io_async_rw), 554bdabba04SPavel Begunkov .prep = io_prep_readv_fixed, 555bdabba04SPavel Begunkov .issue = io_read, 556bdabba04SPavel Begunkov }, 557bdabba04SPavel Begunkov [IORING_OP_WRITEV_FIXED] = { 558bdabba04SPavel Begunkov .needs_file = 1, 559bdabba04SPavel Begunkov .hash_reg_file = 1, 560bdabba04SPavel Begunkov .unbound_nonreg_file = 1, 561bdabba04SPavel Begunkov .pollout = 1, 562bdabba04SPavel Begunkov .plug = 1, 563bdabba04SPavel Begunkov .audit_skip = 1, 564bdabba04SPavel Begunkov .ioprio = 1, 565bdabba04SPavel Begunkov .iopoll = 1, 566bdabba04SPavel Begunkov .iopoll_queue = 1, 567bdabba04SPavel Begunkov .vectored = 1, 568bdabba04SPavel Begunkov .async_size = sizeof(struct io_async_rw), 569bdabba04SPavel Begunkov .prep = io_prep_writev_fixed, 570bdabba04SPavel Begunkov .issue = io_write, 571bdabba04SPavel Begunkov }, 572f30bd4d0SBreno Leitao }; 573f30bd4d0SBreno Leitao 574f30bd4d0SBreno Leitao const struct io_cold_def io_cold_defs[] = { 575f30bd4d0SBreno Leitao [IORING_OP_NOP] = { 576f30bd4d0SBreno Leitao .name = "NOP", 577f30bd4d0SBreno Leitao }, 578f30bd4d0SBreno Leitao [IORING_OP_READV] = { 579f30bd4d0SBreno Leitao .name = "READV", 580f30bd4d0SBreno Leitao .cleanup = io_readv_writev_cleanup, 581f30bd4d0SBreno Leitao .fail = io_rw_fail, 582f30bd4d0SBreno Leitao }, 583f30bd4d0SBreno Leitao [IORING_OP_WRITEV] = { 584f30bd4d0SBreno Leitao .name = "WRITEV", 585f30bd4d0SBreno Leitao .cleanup = io_readv_writev_cleanup, 586f30bd4d0SBreno Leitao .fail = io_rw_fail, 587f30bd4d0SBreno Leitao }, 588f30bd4d0SBreno Leitao [IORING_OP_FSYNC] = { 589f30bd4d0SBreno Leitao .name = "FSYNC", 590f30bd4d0SBreno Leitao }, 591f30bd4d0SBreno Leitao [IORING_OP_READ_FIXED] = { 592f30bd4d0SBreno Leitao .name = "READ_FIXED", 593e1123116SBreno Leitao .cleanup = io_readv_writev_cleanup, 594f30bd4d0SBreno Leitao .fail = io_rw_fail, 595f30bd4d0SBreno Leitao }, 596f30bd4d0SBreno Leitao [IORING_OP_WRITE_FIXED] = { 597f30bd4d0SBreno Leitao .name = "WRITE_FIXED", 598e1123116SBreno Leitao .cleanup = io_readv_writev_cleanup, 599f30bd4d0SBreno Leitao .fail = io_rw_fail, 600f30bd4d0SBreno Leitao }, 601f30bd4d0SBreno Leitao [IORING_OP_POLL_ADD] = { 602f30bd4d0SBreno Leitao .name = "POLL_ADD", 603f30bd4d0SBreno Leitao }, 604f30bd4d0SBreno Leitao [IORING_OP_POLL_REMOVE] = { 605f30bd4d0SBreno Leitao .name = "POLL_REMOVE", 606f30bd4d0SBreno Leitao }, 607f30bd4d0SBreno Leitao [IORING_OP_SYNC_FILE_RANGE] = { 608f30bd4d0SBreno Leitao .name = "SYNC_FILE_RANGE", 609f30bd4d0SBreno Leitao }, 610f30bd4d0SBreno Leitao [IORING_OP_SENDMSG] = { 611f30bd4d0SBreno Leitao .name = "SENDMSG", 612f30bd4d0SBreno Leitao #if defined(CONFIG_NET) 613f30bd4d0SBreno Leitao .cleanup = io_sendmsg_recvmsg_cleanup, 614f30bd4d0SBreno Leitao .fail = io_sendrecv_fail, 615f30bd4d0SBreno Leitao #endif 616f30bd4d0SBreno Leitao }, 617f30bd4d0SBreno Leitao [IORING_OP_RECVMSG] = { 618f30bd4d0SBreno Leitao .name = "RECVMSG", 619f30bd4d0SBreno Leitao #if defined(CONFIG_NET) 620f30bd4d0SBreno Leitao .cleanup = io_sendmsg_recvmsg_cleanup, 621f30bd4d0SBreno Leitao .fail = io_sendrecv_fail, 622f30bd4d0SBreno Leitao #endif 623f30bd4d0SBreno Leitao }, 624f30bd4d0SBreno Leitao [IORING_OP_TIMEOUT] = { 625f30bd4d0SBreno Leitao .name = "TIMEOUT", 626f30bd4d0SBreno Leitao }, 627f30bd4d0SBreno Leitao [IORING_OP_TIMEOUT_REMOVE] = { 628f30bd4d0SBreno Leitao .name = "TIMEOUT_REMOVE", 629f30bd4d0SBreno Leitao }, 630f30bd4d0SBreno Leitao [IORING_OP_ACCEPT] = { 631f30bd4d0SBreno Leitao .name = "ACCEPT", 632f30bd4d0SBreno Leitao }, 633f30bd4d0SBreno Leitao [IORING_OP_ASYNC_CANCEL] = { 634f30bd4d0SBreno Leitao .name = "ASYNC_CANCEL", 635f30bd4d0SBreno Leitao }, 636f30bd4d0SBreno Leitao [IORING_OP_LINK_TIMEOUT] = { 637f30bd4d0SBreno Leitao .name = "LINK_TIMEOUT", 638f30bd4d0SBreno Leitao }, 639f30bd4d0SBreno Leitao [IORING_OP_CONNECT] = { 640f30bd4d0SBreno Leitao .name = "CONNECT", 641f30bd4d0SBreno Leitao }, 642f30bd4d0SBreno Leitao [IORING_OP_FALLOCATE] = { 643f30bd4d0SBreno Leitao .name = "FALLOCATE", 644f30bd4d0SBreno Leitao }, 645f30bd4d0SBreno Leitao [IORING_OP_OPENAT] = { 646f30bd4d0SBreno Leitao .name = "OPENAT", 647f30bd4d0SBreno Leitao .cleanup = io_open_cleanup, 648f30bd4d0SBreno Leitao }, 649f30bd4d0SBreno Leitao [IORING_OP_CLOSE] = { 650f30bd4d0SBreno Leitao .name = "CLOSE", 651f30bd4d0SBreno Leitao }, 652f30bd4d0SBreno Leitao [IORING_OP_FILES_UPDATE] = { 653f30bd4d0SBreno Leitao .name = "FILES_UPDATE", 654f30bd4d0SBreno Leitao }, 655f30bd4d0SBreno Leitao [IORING_OP_STATX] = { 656f30bd4d0SBreno Leitao .name = "STATX", 657f30bd4d0SBreno Leitao .cleanup = io_statx_cleanup, 658f30bd4d0SBreno Leitao }, 659f30bd4d0SBreno Leitao [IORING_OP_READ] = { 660f30bd4d0SBreno Leitao .name = "READ", 661e1123116SBreno Leitao .cleanup = io_readv_writev_cleanup, 662f30bd4d0SBreno Leitao .fail = io_rw_fail, 663f30bd4d0SBreno Leitao }, 664f30bd4d0SBreno Leitao [IORING_OP_WRITE] = { 665f30bd4d0SBreno Leitao .name = "WRITE", 666e1123116SBreno Leitao .cleanup = io_readv_writev_cleanup, 667f30bd4d0SBreno Leitao .fail = io_rw_fail, 668f30bd4d0SBreno Leitao }, 669f30bd4d0SBreno Leitao [IORING_OP_FADVISE] = { 670f30bd4d0SBreno Leitao .name = "FADVISE", 671f30bd4d0SBreno Leitao }, 672f30bd4d0SBreno Leitao [IORING_OP_MADVISE] = { 673f30bd4d0SBreno Leitao .name = "MADVISE", 674f30bd4d0SBreno Leitao }, 675f30bd4d0SBreno Leitao [IORING_OP_SEND] = { 676f30bd4d0SBreno Leitao .name = "SEND", 677f30bd4d0SBreno Leitao #if defined(CONFIG_NET) 67854cdcca0SJens Axboe .cleanup = io_sendmsg_recvmsg_cleanup, 679f30bd4d0SBreno Leitao .fail = io_sendrecv_fail, 680f30bd4d0SBreno Leitao #endif 681f30bd4d0SBreno Leitao }, 682f30bd4d0SBreno Leitao [IORING_OP_RECV] = { 683f30bd4d0SBreno Leitao .name = "RECV", 684f30bd4d0SBreno Leitao #if defined(CONFIG_NET) 6854a3223f7SJens Axboe .cleanup = io_sendmsg_recvmsg_cleanup, 686f30bd4d0SBreno Leitao .fail = io_sendrecv_fail, 687f30bd4d0SBreno Leitao #endif 688f30bd4d0SBreno Leitao }, 689f30bd4d0SBreno Leitao [IORING_OP_OPENAT2] = { 690f30bd4d0SBreno Leitao .name = "OPENAT2", 691f30bd4d0SBreno Leitao .cleanup = io_open_cleanup, 692f30bd4d0SBreno Leitao }, 693f30bd4d0SBreno Leitao [IORING_OP_EPOLL_CTL] = { 694f30bd4d0SBreno Leitao .name = "EPOLL", 695f30bd4d0SBreno Leitao }, 696f30bd4d0SBreno Leitao [IORING_OP_SPLICE] = { 697f30bd4d0SBreno Leitao .name = "SPLICE", 698743fb58aSJens Axboe .cleanup = io_splice_cleanup, 699f30bd4d0SBreno Leitao }, 700f30bd4d0SBreno Leitao [IORING_OP_PROVIDE_BUFFERS] = { 701f30bd4d0SBreno Leitao .name = "PROVIDE_BUFFERS", 702f30bd4d0SBreno Leitao }, 703f30bd4d0SBreno Leitao [IORING_OP_REMOVE_BUFFERS] = { 704f30bd4d0SBreno Leitao .name = "REMOVE_BUFFERS", 705f30bd4d0SBreno Leitao }, 706f30bd4d0SBreno Leitao [IORING_OP_TEE] = { 707f30bd4d0SBreno Leitao .name = "TEE", 708743fb58aSJens Axboe .cleanup = io_splice_cleanup, 709f30bd4d0SBreno Leitao }, 710f30bd4d0SBreno Leitao [IORING_OP_SHUTDOWN] = { 711f30bd4d0SBreno Leitao .name = "SHUTDOWN", 712f30bd4d0SBreno Leitao }, 713f30bd4d0SBreno Leitao [IORING_OP_RENAMEAT] = { 714f30bd4d0SBreno Leitao .name = "RENAMEAT", 715f30bd4d0SBreno Leitao .cleanup = io_renameat_cleanup, 716f30bd4d0SBreno Leitao }, 717f30bd4d0SBreno Leitao [IORING_OP_UNLINKAT] = { 718f30bd4d0SBreno Leitao .name = "UNLINKAT", 719f30bd4d0SBreno Leitao .cleanup = io_unlinkat_cleanup, 720f30bd4d0SBreno Leitao }, 721f30bd4d0SBreno Leitao [IORING_OP_MKDIRAT] = { 722f30bd4d0SBreno Leitao .name = "MKDIRAT", 723f30bd4d0SBreno Leitao .cleanup = io_mkdirat_cleanup, 724f30bd4d0SBreno Leitao }, 725f30bd4d0SBreno Leitao [IORING_OP_SYMLINKAT] = { 726f30bd4d0SBreno Leitao .name = "SYMLINKAT", 727f30bd4d0SBreno Leitao .cleanup = io_link_cleanup, 728f30bd4d0SBreno Leitao }, 729f30bd4d0SBreno Leitao [IORING_OP_LINKAT] = { 730f30bd4d0SBreno Leitao .name = "LINKAT", 731f30bd4d0SBreno Leitao .cleanup = io_link_cleanup, 732f30bd4d0SBreno Leitao }, 733f30bd4d0SBreno Leitao [IORING_OP_MSG_RING] = { 734f30bd4d0SBreno Leitao .name = "MSG_RING", 735f30bd4d0SBreno Leitao .cleanup = io_msg_ring_cleanup, 736f30bd4d0SBreno Leitao }, 737f30bd4d0SBreno Leitao [IORING_OP_FSETXATTR] = { 738f30bd4d0SBreno Leitao .name = "FSETXATTR", 739f30bd4d0SBreno Leitao .cleanup = io_xattr_cleanup, 740f30bd4d0SBreno Leitao }, 741f30bd4d0SBreno Leitao [IORING_OP_SETXATTR] = { 742f30bd4d0SBreno Leitao .name = "SETXATTR", 743f30bd4d0SBreno Leitao .cleanup = io_xattr_cleanup, 744f30bd4d0SBreno Leitao }, 745f30bd4d0SBreno Leitao [IORING_OP_FGETXATTR] = { 746f30bd4d0SBreno Leitao .name = "FGETXATTR", 747f30bd4d0SBreno Leitao .cleanup = io_xattr_cleanup, 748f30bd4d0SBreno Leitao }, 749f30bd4d0SBreno Leitao [IORING_OP_GETXATTR] = { 750f30bd4d0SBreno Leitao .name = "GETXATTR", 751f30bd4d0SBreno Leitao .cleanup = io_xattr_cleanup, 752f30bd4d0SBreno Leitao }, 753f30bd4d0SBreno Leitao [IORING_OP_SOCKET] = { 754f30bd4d0SBreno Leitao .name = "SOCKET", 755f30bd4d0SBreno Leitao }, 756f30bd4d0SBreno Leitao [IORING_OP_URING_CMD] = { 757f30bd4d0SBreno Leitao .name = "URING_CMD", 758*3a4689acSPavel Begunkov .cleanup = io_uring_cmd_cleanup, 759f30bd4d0SBreno Leitao }, 760f30bd4d0SBreno Leitao [IORING_OP_SEND_ZC] = { 761f30bd4d0SBreno Leitao .name = "SEND_ZC", 762f30bd4d0SBreno Leitao #if defined(CONFIG_NET) 763f30bd4d0SBreno Leitao .cleanup = io_send_zc_cleanup, 764f30bd4d0SBreno Leitao .fail = io_sendrecv_fail, 765f30bd4d0SBreno Leitao #endif 766f30bd4d0SBreno Leitao }, 767f30bd4d0SBreno Leitao [IORING_OP_SENDMSG_ZC] = { 768f30bd4d0SBreno Leitao .name = "SENDMSG_ZC", 769f30bd4d0SBreno Leitao #if defined(CONFIG_NET) 770493108d9SPavel Begunkov .cleanup = io_send_zc_cleanup, 771493108d9SPavel Begunkov .fail = io_sendrecv_fail, 772493108d9SPavel Begunkov #endif 773493108d9SPavel Begunkov }, 774fc68fcdaSJens Axboe [IORING_OP_READ_MULTISHOT] = { 775fc68fcdaSJens Axboe .name = "READ_MULTISHOT", 776e1123116SBreno Leitao .cleanup = io_readv_writev_cleanup, 777fc68fcdaSJens Axboe }, 778f31ecf67SJens Axboe [IORING_OP_WAITID] = { 779f31ecf67SJens Axboe .name = "WAITID", 780f31ecf67SJens Axboe }, 781194bb58cSJens Axboe [IORING_OP_FUTEX_WAIT] = { 782194bb58cSJens Axboe .name = "FUTEX_WAIT", 783194bb58cSJens Axboe }, 784194bb58cSJens Axboe [IORING_OP_FUTEX_WAKE] = { 785194bb58cSJens Axboe .name = "FUTEX_WAKE", 786194bb58cSJens Axboe }, 7878f350194SJens Axboe [IORING_OP_FUTEX_WAITV] = { 7888f350194SJens Axboe .name = "FUTEX_WAITV", 7898f350194SJens Axboe }, 790dc18b89aSJens Axboe [IORING_OP_FIXED_FD_INSTALL] = { 791dc18b89aSJens Axboe .name = "FIXED_FD_INSTALL", 792dc18b89aSJens Axboe }, 793b4bb1900STony Solomonik [IORING_OP_FTRUNCATE] = { 794b4bb1900STony Solomonik .name = "FTRUNCATE", 795b4bb1900STony Solomonik }, 7967481fd93SGabriel Krisman Bertazi [IORING_OP_BIND] = { 7977481fd93SGabriel Krisman Bertazi .name = "BIND", 7987481fd93SGabriel Krisman Bertazi }, 799ff140cc8SGabriel Krisman Bertazi [IORING_OP_LISTEN] = { 800ff140cc8SGabriel Krisman Bertazi .name = "LISTEN", 801ff140cc8SGabriel Krisman Bertazi }, 80211ed914bSDavid Wei [IORING_OP_RECV_ZC] = { 80311ed914bSDavid Wei .name = "RECV_ZC", 80411ed914bSDavid Wei }, 80519f7e942SJens Axboe [IORING_OP_EPOLL_WAIT] = { 80619f7e942SJens Axboe .name = "EPOLL_WAIT", 80719f7e942SJens Axboe }, 808bdabba04SPavel Begunkov [IORING_OP_READV_FIXED] = { 809bdabba04SPavel Begunkov .name = "READV_FIXED", 810bdabba04SPavel Begunkov .cleanup = io_readv_writev_cleanup, 811bdabba04SPavel Begunkov .fail = io_rw_fail, 812bdabba04SPavel Begunkov }, 813bdabba04SPavel Begunkov [IORING_OP_WRITEV_FIXED] = { 814bdabba04SPavel Begunkov .name = "WRITEV_FIXED", 815bdabba04SPavel Begunkov .cleanup = io_readv_writev_cleanup, 816bdabba04SPavel Begunkov .fail = io_rw_fail, 817bdabba04SPavel Begunkov }, 818d9b57aa3SJens Axboe }; 819d9b57aa3SJens Axboe 820d9b57aa3SJens Axboe const char *io_uring_get_opcode(u8 opcode) 821d9b57aa3SJens Axboe { 822d9b57aa3SJens Axboe if (opcode < IORING_OP_LAST) 823f30bd4d0SBreno Leitao return io_cold_defs[opcode].name; 824d9b57aa3SJens Axboe return "INVALID"; 825d9b57aa3SJens Axboe } 826d9b57aa3SJens Axboe 8273e05b222SGabriel Krisman Bertazi bool io_uring_op_supported(u8 opcode) 8283e05b222SGabriel Krisman Bertazi { 8293e05b222SGabriel Krisman Bertazi if (opcode < IORING_OP_LAST && 8303e05b222SGabriel Krisman Bertazi io_issue_defs[opcode].prep != io_eopnotsupp_prep) 8313e05b222SGabriel Krisman Bertazi return true; 8323e05b222SGabriel Krisman Bertazi return false; 8333e05b222SGabriel Krisman Bertazi } 8343e05b222SGabriel Krisman Bertazi 835d9b57aa3SJens Axboe void __init io_uring_optable_init(void) 836d9b57aa3SJens Axboe { 837d9b57aa3SJens Axboe int i; 838d9b57aa3SJens Axboe 839f30bd4d0SBreno Leitao BUILD_BUG_ON(ARRAY_SIZE(io_cold_defs) != IORING_OP_LAST); 840a7dd2782SBreno Leitao BUILD_BUG_ON(ARRAY_SIZE(io_issue_defs) != IORING_OP_LAST); 841d9b57aa3SJens Axboe 842a7dd2782SBreno Leitao for (i = 0; i < ARRAY_SIZE(io_issue_defs); i++) { 843a7dd2782SBreno Leitao BUG_ON(!io_issue_defs[i].prep); 844a7dd2782SBreno Leitao if (io_issue_defs[i].prep != io_eopnotsupp_prep) 845a7dd2782SBreno Leitao BUG_ON(!io_issue_defs[i].issue); 846f30bd4d0SBreno Leitao WARN_ON_ONCE(!io_cold_defs[i].name); 847d9b57aa3SJens Axboe } 848d9b57aa3SJens Axboe } 849