162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * io_uring opcode handling table 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#include <linux/kernel.h> 662306a36Sopenharmony_ci#include <linux/errno.h> 762306a36Sopenharmony_ci#include <linux/fs.h> 862306a36Sopenharmony_ci#include <linux/file.h> 962306a36Sopenharmony_ci#include <linux/io_uring.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "io_uring.h" 1262306a36Sopenharmony_ci#include "opdef.h" 1362306a36Sopenharmony_ci#include "refs.h" 1462306a36Sopenharmony_ci#include "tctx.h" 1562306a36Sopenharmony_ci#include "sqpoll.h" 1662306a36Sopenharmony_ci#include "fdinfo.h" 1762306a36Sopenharmony_ci#include "kbuf.h" 1862306a36Sopenharmony_ci#include "rsrc.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include "xattr.h" 2162306a36Sopenharmony_ci#include "nop.h" 2262306a36Sopenharmony_ci#include "fs.h" 2362306a36Sopenharmony_ci#include "splice.h" 2462306a36Sopenharmony_ci#include "sync.h" 2562306a36Sopenharmony_ci#include "advise.h" 2662306a36Sopenharmony_ci#include "openclose.h" 2762306a36Sopenharmony_ci#include "uring_cmd.h" 2862306a36Sopenharmony_ci#include "epoll.h" 2962306a36Sopenharmony_ci#include "statx.h" 3062306a36Sopenharmony_ci#include "net.h" 3162306a36Sopenharmony_ci#include "msg_ring.h" 3262306a36Sopenharmony_ci#include "timeout.h" 3362306a36Sopenharmony_ci#include "poll.h" 3462306a36Sopenharmony_ci#include "cancel.h" 3562306a36Sopenharmony_ci#include "rw.h" 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic int io_no_issue(struct io_kiocb *req, unsigned int issue_flags) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci WARN_ON_ONCE(1); 4062306a36Sopenharmony_ci return -ECANCELED; 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic __maybe_unused int io_eopnotsupp_prep(struct io_kiocb *kiocb, 4462306a36Sopenharmony_ci const struct io_uring_sqe *sqe) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci return -EOPNOTSUPP; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciconst struct io_issue_def io_issue_defs[] = { 5062306a36Sopenharmony_ci [IORING_OP_NOP] = { 5162306a36Sopenharmony_ci .audit_skip = 1, 5262306a36Sopenharmony_ci .iopoll = 1, 5362306a36Sopenharmony_ci .prep = io_nop_prep, 5462306a36Sopenharmony_ci .issue = io_nop, 5562306a36Sopenharmony_ci }, 5662306a36Sopenharmony_ci [IORING_OP_READV] = { 5762306a36Sopenharmony_ci .needs_file = 1, 5862306a36Sopenharmony_ci .unbound_nonreg_file = 1, 5962306a36Sopenharmony_ci .pollin = 1, 6062306a36Sopenharmony_ci .buffer_select = 1, 6162306a36Sopenharmony_ci .plug = 1, 6262306a36Sopenharmony_ci .audit_skip = 1, 6362306a36Sopenharmony_ci .ioprio = 1, 6462306a36Sopenharmony_ci .iopoll = 1, 6562306a36Sopenharmony_ci .iopoll_queue = 1, 6662306a36Sopenharmony_ci .prep = io_prep_rw, 6762306a36Sopenharmony_ci .issue = io_read, 6862306a36Sopenharmony_ci }, 6962306a36Sopenharmony_ci [IORING_OP_WRITEV] = { 7062306a36Sopenharmony_ci .needs_file = 1, 7162306a36Sopenharmony_ci .hash_reg_file = 1, 7262306a36Sopenharmony_ci .unbound_nonreg_file = 1, 7362306a36Sopenharmony_ci .pollout = 1, 7462306a36Sopenharmony_ci .plug = 1, 7562306a36Sopenharmony_ci .audit_skip = 1, 7662306a36Sopenharmony_ci .ioprio = 1, 7762306a36Sopenharmony_ci .iopoll = 1, 7862306a36Sopenharmony_ci .iopoll_queue = 1, 7962306a36Sopenharmony_ci .prep = io_prep_rw, 8062306a36Sopenharmony_ci .issue = io_write, 8162306a36Sopenharmony_ci }, 8262306a36Sopenharmony_ci [IORING_OP_FSYNC] = { 8362306a36Sopenharmony_ci .needs_file = 1, 8462306a36Sopenharmony_ci .audit_skip = 1, 8562306a36Sopenharmony_ci .prep = io_fsync_prep, 8662306a36Sopenharmony_ci .issue = io_fsync, 8762306a36Sopenharmony_ci }, 8862306a36Sopenharmony_ci [IORING_OP_READ_FIXED] = { 8962306a36Sopenharmony_ci .needs_file = 1, 9062306a36Sopenharmony_ci .unbound_nonreg_file = 1, 9162306a36Sopenharmony_ci .pollin = 1, 9262306a36Sopenharmony_ci .plug = 1, 9362306a36Sopenharmony_ci .audit_skip = 1, 9462306a36Sopenharmony_ci .ioprio = 1, 9562306a36Sopenharmony_ci .iopoll = 1, 9662306a36Sopenharmony_ci .iopoll_queue = 1, 9762306a36Sopenharmony_ci .prep = io_prep_rw, 9862306a36Sopenharmony_ci .issue = io_read, 9962306a36Sopenharmony_ci }, 10062306a36Sopenharmony_ci [IORING_OP_WRITE_FIXED] = { 10162306a36Sopenharmony_ci .needs_file = 1, 10262306a36Sopenharmony_ci .hash_reg_file = 1, 10362306a36Sopenharmony_ci .unbound_nonreg_file = 1, 10462306a36Sopenharmony_ci .pollout = 1, 10562306a36Sopenharmony_ci .plug = 1, 10662306a36Sopenharmony_ci .audit_skip = 1, 10762306a36Sopenharmony_ci .ioprio = 1, 10862306a36Sopenharmony_ci .iopoll = 1, 10962306a36Sopenharmony_ci .iopoll_queue = 1, 11062306a36Sopenharmony_ci .prep = io_prep_rw, 11162306a36Sopenharmony_ci .issue = io_write, 11262306a36Sopenharmony_ci }, 11362306a36Sopenharmony_ci [IORING_OP_POLL_ADD] = { 11462306a36Sopenharmony_ci .needs_file = 1, 11562306a36Sopenharmony_ci .unbound_nonreg_file = 1, 11662306a36Sopenharmony_ci .audit_skip = 1, 11762306a36Sopenharmony_ci .prep = io_poll_add_prep, 11862306a36Sopenharmony_ci .issue = io_poll_add, 11962306a36Sopenharmony_ci }, 12062306a36Sopenharmony_ci [IORING_OP_POLL_REMOVE] = { 12162306a36Sopenharmony_ci .audit_skip = 1, 12262306a36Sopenharmony_ci .prep = io_poll_remove_prep, 12362306a36Sopenharmony_ci .issue = io_poll_remove, 12462306a36Sopenharmony_ci }, 12562306a36Sopenharmony_ci [IORING_OP_SYNC_FILE_RANGE] = { 12662306a36Sopenharmony_ci .needs_file = 1, 12762306a36Sopenharmony_ci .audit_skip = 1, 12862306a36Sopenharmony_ci .prep = io_sfr_prep, 12962306a36Sopenharmony_ci .issue = io_sync_file_range, 13062306a36Sopenharmony_ci }, 13162306a36Sopenharmony_ci [IORING_OP_SENDMSG] = { 13262306a36Sopenharmony_ci .needs_file = 1, 13362306a36Sopenharmony_ci .unbound_nonreg_file = 1, 13462306a36Sopenharmony_ci .pollout = 1, 13562306a36Sopenharmony_ci .ioprio = 1, 13662306a36Sopenharmony_ci .manual_alloc = 1, 13762306a36Sopenharmony_ci#if defined(CONFIG_NET) 13862306a36Sopenharmony_ci .prep = io_sendmsg_prep, 13962306a36Sopenharmony_ci .issue = io_sendmsg, 14062306a36Sopenharmony_ci#else 14162306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 14262306a36Sopenharmony_ci#endif 14362306a36Sopenharmony_ci }, 14462306a36Sopenharmony_ci [IORING_OP_RECVMSG] = { 14562306a36Sopenharmony_ci .needs_file = 1, 14662306a36Sopenharmony_ci .unbound_nonreg_file = 1, 14762306a36Sopenharmony_ci .pollin = 1, 14862306a36Sopenharmony_ci .buffer_select = 1, 14962306a36Sopenharmony_ci .ioprio = 1, 15062306a36Sopenharmony_ci .manual_alloc = 1, 15162306a36Sopenharmony_ci#if defined(CONFIG_NET) 15262306a36Sopenharmony_ci .prep = io_recvmsg_prep, 15362306a36Sopenharmony_ci .issue = io_recvmsg, 15462306a36Sopenharmony_ci#else 15562306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 15662306a36Sopenharmony_ci#endif 15762306a36Sopenharmony_ci }, 15862306a36Sopenharmony_ci [IORING_OP_TIMEOUT] = { 15962306a36Sopenharmony_ci .audit_skip = 1, 16062306a36Sopenharmony_ci .prep = io_timeout_prep, 16162306a36Sopenharmony_ci .issue = io_timeout, 16262306a36Sopenharmony_ci }, 16362306a36Sopenharmony_ci [IORING_OP_TIMEOUT_REMOVE] = { 16462306a36Sopenharmony_ci /* used by timeout updates' prep() */ 16562306a36Sopenharmony_ci .audit_skip = 1, 16662306a36Sopenharmony_ci .prep = io_timeout_remove_prep, 16762306a36Sopenharmony_ci .issue = io_timeout_remove, 16862306a36Sopenharmony_ci }, 16962306a36Sopenharmony_ci [IORING_OP_ACCEPT] = { 17062306a36Sopenharmony_ci .needs_file = 1, 17162306a36Sopenharmony_ci .unbound_nonreg_file = 1, 17262306a36Sopenharmony_ci .pollin = 1, 17362306a36Sopenharmony_ci .poll_exclusive = 1, 17462306a36Sopenharmony_ci .ioprio = 1, /* used for flags */ 17562306a36Sopenharmony_ci#if defined(CONFIG_NET) 17662306a36Sopenharmony_ci .prep = io_accept_prep, 17762306a36Sopenharmony_ci .issue = io_accept, 17862306a36Sopenharmony_ci#else 17962306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 18062306a36Sopenharmony_ci#endif 18162306a36Sopenharmony_ci }, 18262306a36Sopenharmony_ci [IORING_OP_ASYNC_CANCEL] = { 18362306a36Sopenharmony_ci .audit_skip = 1, 18462306a36Sopenharmony_ci .prep = io_async_cancel_prep, 18562306a36Sopenharmony_ci .issue = io_async_cancel, 18662306a36Sopenharmony_ci }, 18762306a36Sopenharmony_ci [IORING_OP_LINK_TIMEOUT] = { 18862306a36Sopenharmony_ci .audit_skip = 1, 18962306a36Sopenharmony_ci .prep = io_link_timeout_prep, 19062306a36Sopenharmony_ci .issue = io_no_issue, 19162306a36Sopenharmony_ci }, 19262306a36Sopenharmony_ci [IORING_OP_CONNECT] = { 19362306a36Sopenharmony_ci .needs_file = 1, 19462306a36Sopenharmony_ci .unbound_nonreg_file = 1, 19562306a36Sopenharmony_ci .pollout = 1, 19662306a36Sopenharmony_ci#if defined(CONFIG_NET) 19762306a36Sopenharmony_ci .prep = io_connect_prep, 19862306a36Sopenharmony_ci .issue = io_connect, 19962306a36Sopenharmony_ci#else 20062306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 20162306a36Sopenharmony_ci#endif 20262306a36Sopenharmony_ci }, 20362306a36Sopenharmony_ci [IORING_OP_FALLOCATE] = { 20462306a36Sopenharmony_ci .needs_file = 1, 20562306a36Sopenharmony_ci .prep = io_fallocate_prep, 20662306a36Sopenharmony_ci .issue = io_fallocate, 20762306a36Sopenharmony_ci }, 20862306a36Sopenharmony_ci [IORING_OP_OPENAT] = { 20962306a36Sopenharmony_ci .prep = io_openat_prep, 21062306a36Sopenharmony_ci .issue = io_openat, 21162306a36Sopenharmony_ci }, 21262306a36Sopenharmony_ci [IORING_OP_CLOSE] = { 21362306a36Sopenharmony_ci .prep = io_close_prep, 21462306a36Sopenharmony_ci .issue = io_close, 21562306a36Sopenharmony_ci }, 21662306a36Sopenharmony_ci [IORING_OP_FILES_UPDATE] = { 21762306a36Sopenharmony_ci .audit_skip = 1, 21862306a36Sopenharmony_ci .iopoll = 1, 21962306a36Sopenharmony_ci .prep = io_files_update_prep, 22062306a36Sopenharmony_ci .issue = io_files_update, 22162306a36Sopenharmony_ci }, 22262306a36Sopenharmony_ci [IORING_OP_STATX] = { 22362306a36Sopenharmony_ci .audit_skip = 1, 22462306a36Sopenharmony_ci .prep = io_statx_prep, 22562306a36Sopenharmony_ci .issue = io_statx, 22662306a36Sopenharmony_ci }, 22762306a36Sopenharmony_ci [IORING_OP_READ] = { 22862306a36Sopenharmony_ci .needs_file = 1, 22962306a36Sopenharmony_ci .unbound_nonreg_file = 1, 23062306a36Sopenharmony_ci .pollin = 1, 23162306a36Sopenharmony_ci .buffer_select = 1, 23262306a36Sopenharmony_ci .plug = 1, 23362306a36Sopenharmony_ci .audit_skip = 1, 23462306a36Sopenharmony_ci .ioprio = 1, 23562306a36Sopenharmony_ci .iopoll = 1, 23662306a36Sopenharmony_ci .iopoll_queue = 1, 23762306a36Sopenharmony_ci .prep = io_prep_rw, 23862306a36Sopenharmony_ci .issue = io_read, 23962306a36Sopenharmony_ci }, 24062306a36Sopenharmony_ci [IORING_OP_WRITE] = { 24162306a36Sopenharmony_ci .needs_file = 1, 24262306a36Sopenharmony_ci .hash_reg_file = 1, 24362306a36Sopenharmony_ci .unbound_nonreg_file = 1, 24462306a36Sopenharmony_ci .pollout = 1, 24562306a36Sopenharmony_ci .plug = 1, 24662306a36Sopenharmony_ci .audit_skip = 1, 24762306a36Sopenharmony_ci .ioprio = 1, 24862306a36Sopenharmony_ci .iopoll = 1, 24962306a36Sopenharmony_ci .iopoll_queue = 1, 25062306a36Sopenharmony_ci .prep = io_prep_rw, 25162306a36Sopenharmony_ci .issue = io_write, 25262306a36Sopenharmony_ci }, 25362306a36Sopenharmony_ci [IORING_OP_FADVISE] = { 25462306a36Sopenharmony_ci .needs_file = 1, 25562306a36Sopenharmony_ci .audit_skip = 1, 25662306a36Sopenharmony_ci .prep = io_fadvise_prep, 25762306a36Sopenharmony_ci .issue = io_fadvise, 25862306a36Sopenharmony_ci }, 25962306a36Sopenharmony_ci [IORING_OP_MADVISE] = { 26062306a36Sopenharmony_ci .audit_skip = 1, 26162306a36Sopenharmony_ci .prep = io_madvise_prep, 26262306a36Sopenharmony_ci .issue = io_madvise, 26362306a36Sopenharmony_ci }, 26462306a36Sopenharmony_ci [IORING_OP_SEND] = { 26562306a36Sopenharmony_ci .needs_file = 1, 26662306a36Sopenharmony_ci .unbound_nonreg_file = 1, 26762306a36Sopenharmony_ci .pollout = 1, 26862306a36Sopenharmony_ci .audit_skip = 1, 26962306a36Sopenharmony_ci .ioprio = 1, 27062306a36Sopenharmony_ci .manual_alloc = 1, 27162306a36Sopenharmony_ci#if defined(CONFIG_NET) 27262306a36Sopenharmony_ci .prep = io_sendmsg_prep, 27362306a36Sopenharmony_ci .issue = io_send, 27462306a36Sopenharmony_ci#else 27562306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 27662306a36Sopenharmony_ci#endif 27762306a36Sopenharmony_ci }, 27862306a36Sopenharmony_ci [IORING_OP_RECV] = { 27962306a36Sopenharmony_ci .needs_file = 1, 28062306a36Sopenharmony_ci .unbound_nonreg_file = 1, 28162306a36Sopenharmony_ci .pollin = 1, 28262306a36Sopenharmony_ci .buffer_select = 1, 28362306a36Sopenharmony_ci .audit_skip = 1, 28462306a36Sopenharmony_ci .ioprio = 1, 28562306a36Sopenharmony_ci#if defined(CONFIG_NET) 28662306a36Sopenharmony_ci .prep = io_recvmsg_prep, 28762306a36Sopenharmony_ci .issue = io_recv, 28862306a36Sopenharmony_ci#else 28962306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 29062306a36Sopenharmony_ci#endif 29162306a36Sopenharmony_ci }, 29262306a36Sopenharmony_ci [IORING_OP_OPENAT2] = { 29362306a36Sopenharmony_ci .prep = io_openat2_prep, 29462306a36Sopenharmony_ci .issue = io_openat2, 29562306a36Sopenharmony_ci }, 29662306a36Sopenharmony_ci [IORING_OP_EPOLL_CTL] = { 29762306a36Sopenharmony_ci .unbound_nonreg_file = 1, 29862306a36Sopenharmony_ci .audit_skip = 1, 29962306a36Sopenharmony_ci#if defined(CONFIG_EPOLL) 30062306a36Sopenharmony_ci .prep = io_epoll_ctl_prep, 30162306a36Sopenharmony_ci .issue = io_epoll_ctl, 30262306a36Sopenharmony_ci#else 30362306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 30462306a36Sopenharmony_ci#endif 30562306a36Sopenharmony_ci }, 30662306a36Sopenharmony_ci [IORING_OP_SPLICE] = { 30762306a36Sopenharmony_ci .needs_file = 1, 30862306a36Sopenharmony_ci .hash_reg_file = 1, 30962306a36Sopenharmony_ci .unbound_nonreg_file = 1, 31062306a36Sopenharmony_ci .audit_skip = 1, 31162306a36Sopenharmony_ci .prep = io_splice_prep, 31262306a36Sopenharmony_ci .issue = io_splice, 31362306a36Sopenharmony_ci }, 31462306a36Sopenharmony_ci [IORING_OP_PROVIDE_BUFFERS] = { 31562306a36Sopenharmony_ci .audit_skip = 1, 31662306a36Sopenharmony_ci .iopoll = 1, 31762306a36Sopenharmony_ci .prep = io_provide_buffers_prep, 31862306a36Sopenharmony_ci .issue = io_provide_buffers, 31962306a36Sopenharmony_ci }, 32062306a36Sopenharmony_ci [IORING_OP_REMOVE_BUFFERS] = { 32162306a36Sopenharmony_ci .audit_skip = 1, 32262306a36Sopenharmony_ci .iopoll = 1, 32362306a36Sopenharmony_ci .prep = io_remove_buffers_prep, 32462306a36Sopenharmony_ci .issue = io_remove_buffers, 32562306a36Sopenharmony_ci }, 32662306a36Sopenharmony_ci [IORING_OP_TEE] = { 32762306a36Sopenharmony_ci .needs_file = 1, 32862306a36Sopenharmony_ci .hash_reg_file = 1, 32962306a36Sopenharmony_ci .unbound_nonreg_file = 1, 33062306a36Sopenharmony_ci .audit_skip = 1, 33162306a36Sopenharmony_ci .prep = io_tee_prep, 33262306a36Sopenharmony_ci .issue = io_tee, 33362306a36Sopenharmony_ci }, 33462306a36Sopenharmony_ci [IORING_OP_SHUTDOWN] = { 33562306a36Sopenharmony_ci .needs_file = 1, 33662306a36Sopenharmony_ci#if defined(CONFIG_NET) 33762306a36Sopenharmony_ci .prep = io_shutdown_prep, 33862306a36Sopenharmony_ci .issue = io_shutdown, 33962306a36Sopenharmony_ci#else 34062306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 34162306a36Sopenharmony_ci#endif 34262306a36Sopenharmony_ci }, 34362306a36Sopenharmony_ci [IORING_OP_RENAMEAT] = { 34462306a36Sopenharmony_ci .prep = io_renameat_prep, 34562306a36Sopenharmony_ci .issue = io_renameat, 34662306a36Sopenharmony_ci }, 34762306a36Sopenharmony_ci [IORING_OP_UNLINKAT] = { 34862306a36Sopenharmony_ci .prep = io_unlinkat_prep, 34962306a36Sopenharmony_ci .issue = io_unlinkat, 35062306a36Sopenharmony_ci }, 35162306a36Sopenharmony_ci [IORING_OP_MKDIRAT] = { 35262306a36Sopenharmony_ci .prep = io_mkdirat_prep, 35362306a36Sopenharmony_ci .issue = io_mkdirat, 35462306a36Sopenharmony_ci }, 35562306a36Sopenharmony_ci [IORING_OP_SYMLINKAT] = { 35662306a36Sopenharmony_ci .prep = io_symlinkat_prep, 35762306a36Sopenharmony_ci .issue = io_symlinkat, 35862306a36Sopenharmony_ci }, 35962306a36Sopenharmony_ci [IORING_OP_LINKAT] = { 36062306a36Sopenharmony_ci .prep = io_linkat_prep, 36162306a36Sopenharmony_ci .issue = io_linkat, 36262306a36Sopenharmony_ci }, 36362306a36Sopenharmony_ci [IORING_OP_MSG_RING] = { 36462306a36Sopenharmony_ci .needs_file = 1, 36562306a36Sopenharmony_ci .iopoll = 1, 36662306a36Sopenharmony_ci .prep = io_msg_ring_prep, 36762306a36Sopenharmony_ci .issue = io_msg_ring, 36862306a36Sopenharmony_ci }, 36962306a36Sopenharmony_ci [IORING_OP_FSETXATTR] = { 37062306a36Sopenharmony_ci .needs_file = 1, 37162306a36Sopenharmony_ci .prep = io_fsetxattr_prep, 37262306a36Sopenharmony_ci .issue = io_fsetxattr, 37362306a36Sopenharmony_ci }, 37462306a36Sopenharmony_ci [IORING_OP_SETXATTR] = { 37562306a36Sopenharmony_ci .prep = io_setxattr_prep, 37662306a36Sopenharmony_ci .issue = io_setxattr, 37762306a36Sopenharmony_ci }, 37862306a36Sopenharmony_ci [IORING_OP_FGETXATTR] = { 37962306a36Sopenharmony_ci .needs_file = 1, 38062306a36Sopenharmony_ci .prep = io_fgetxattr_prep, 38162306a36Sopenharmony_ci .issue = io_fgetxattr, 38262306a36Sopenharmony_ci }, 38362306a36Sopenharmony_ci [IORING_OP_GETXATTR] = { 38462306a36Sopenharmony_ci .prep = io_getxattr_prep, 38562306a36Sopenharmony_ci .issue = io_getxattr, 38662306a36Sopenharmony_ci }, 38762306a36Sopenharmony_ci [IORING_OP_SOCKET] = { 38862306a36Sopenharmony_ci .audit_skip = 1, 38962306a36Sopenharmony_ci#if defined(CONFIG_NET) 39062306a36Sopenharmony_ci .prep = io_socket_prep, 39162306a36Sopenharmony_ci .issue = io_socket, 39262306a36Sopenharmony_ci#else 39362306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 39462306a36Sopenharmony_ci#endif 39562306a36Sopenharmony_ci }, 39662306a36Sopenharmony_ci [IORING_OP_URING_CMD] = { 39762306a36Sopenharmony_ci .needs_file = 1, 39862306a36Sopenharmony_ci .plug = 1, 39962306a36Sopenharmony_ci .iopoll = 1, 40062306a36Sopenharmony_ci .iopoll_queue = 1, 40162306a36Sopenharmony_ci .prep = io_uring_cmd_prep, 40262306a36Sopenharmony_ci .issue = io_uring_cmd, 40362306a36Sopenharmony_ci }, 40462306a36Sopenharmony_ci [IORING_OP_SEND_ZC] = { 40562306a36Sopenharmony_ci .needs_file = 1, 40662306a36Sopenharmony_ci .unbound_nonreg_file = 1, 40762306a36Sopenharmony_ci .pollout = 1, 40862306a36Sopenharmony_ci .audit_skip = 1, 40962306a36Sopenharmony_ci .ioprio = 1, 41062306a36Sopenharmony_ci .manual_alloc = 1, 41162306a36Sopenharmony_ci#if defined(CONFIG_NET) 41262306a36Sopenharmony_ci .prep = io_send_zc_prep, 41362306a36Sopenharmony_ci .issue = io_send_zc, 41462306a36Sopenharmony_ci#else 41562306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 41662306a36Sopenharmony_ci#endif 41762306a36Sopenharmony_ci }, 41862306a36Sopenharmony_ci [IORING_OP_SENDMSG_ZC] = { 41962306a36Sopenharmony_ci .needs_file = 1, 42062306a36Sopenharmony_ci .unbound_nonreg_file = 1, 42162306a36Sopenharmony_ci .pollout = 1, 42262306a36Sopenharmony_ci .ioprio = 1, 42362306a36Sopenharmony_ci .manual_alloc = 1, 42462306a36Sopenharmony_ci#if defined(CONFIG_NET) 42562306a36Sopenharmony_ci .prep = io_send_zc_prep, 42662306a36Sopenharmony_ci .issue = io_sendmsg_zc, 42762306a36Sopenharmony_ci#else 42862306a36Sopenharmony_ci .prep = io_eopnotsupp_prep, 42962306a36Sopenharmony_ci#endif 43062306a36Sopenharmony_ci }, 43162306a36Sopenharmony_ci}; 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ciconst struct io_cold_def io_cold_defs[] = { 43562306a36Sopenharmony_ci [IORING_OP_NOP] = { 43662306a36Sopenharmony_ci .name = "NOP", 43762306a36Sopenharmony_ci }, 43862306a36Sopenharmony_ci [IORING_OP_READV] = { 43962306a36Sopenharmony_ci .async_size = sizeof(struct io_async_rw), 44062306a36Sopenharmony_ci .name = "READV", 44162306a36Sopenharmony_ci .prep_async = io_readv_prep_async, 44262306a36Sopenharmony_ci .cleanup = io_readv_writev_cleanup, 44362306a36Sopenharmony_ci .fail = io_rw_fail, 44462306a36Sopenharmony_ci }, 44562306a36Sopenharmony_ci [IORING_OP_WRITEV] = { 44662306a36Sopenharmony_ci .async_size = sizeof(struct io_async_rw), 44762306a36Sopenharmony_ci .name = "WRITEV", 44862306a36Sopenharmony_ci .prep_async = io_writev_prep_async, 44962306a36Sopenharmony_ci .cleanup = io_readv_writev_cleanup, 45062306a36Sopenharmony_ci .fail = io_rw_fail, 45162306a36Sopenharmony_ci }, 45262306a36Sopenharmony_ci [IORING_OP_FSYNC] = { 45362306a36Sopenharmony_ci .name = "FSYNC", 45462306a36Sopenharmony_ci }, 45562306a36Sopenharmony_ci [IORING_OP_READ_FIXED] = { 45662306a36Sopenharmony_ci .async_size = sizeof(struct io_async_rw), 45762306a36Sopenharmony_ci .name = "READ_FIXED", 45862306a36Sopenharmony_ci .fail = io_rw_fail, 45962306a36Sopenharmony_ci }, 46062306a36Sopenharmony_ci [IORING_OP_WRITE_FIXED] = { 46162306a36Sopenharmony_ci .async_size = sizeof(struct io_async_rw), 46262306a36Sopenharmony_ci .name = "WRITE_FIXED", 46362306a36Sopenharmony_ci .fail = io_rw_fail, 46462306a36Sopenharmony_ci }, 46562306a36Sopenharmony_ci [IORING_OP_POLL_ADD] = { 46662306a36Sopenharmony_ci .name = "POLL_ADD", 46762306a36Sopenharmony_ci }, 46862306a36Sopenharmony_ci [IORING_OP_POLL_REMOVE] = { 46962306a36Sopenharmony_ci .name = "POLL_REMOVE", 47062306a36Sopenharmony_ci }, 47162306a36Sopenharmony_ci [IORING_OP_SYNC_FILE_RANGE] = { 47262306a36Sopenharmony_ci .name = "SYNC_FILE_RANGE", 47362306a36Sopenharmony_ci }, 47462306a36Sopenharmony_ci [IORING_OP_SENDMSG] = { 47562306a36Sopenharmony_ci .name = "SENDMSG", 47662306a36Sopenharmony_ci#if defined(CONFIG_NET) 47762306a36Sopenharmony_ci .async_size = sizeof(struct io_async_msghdr), 47862306a36Sopenharmony_ci .prep_async = io_sendmsg_prep_async, 47962306a36Sopenharmony_ci .cleanup = io_sendmsg_recvmsg_cleanup, 48062306a36Sopenharmony_ci .fail = io_sendrecv_fail, 48162306a36Sopenharmony_ci#endif 48262306a36Sopenharmony_ci }, 48362306a36Sopenharmony_ci [IORING_OP_RECVMSG] = { 48462306a36Sopenharmony_ci .name = "RECVMSG", 48562306a36Sopenharmony_ci#if defined(CONFIG_NET) 48662306a36Sopenharmony_ci .async_size = sizeof(struct io_async_msghdr), 48762306a36Sopenharmony_ci .prep_async = io_recvmsg_prep_async, 48862306a36Sopenharmony_ci .cleanup = io_sendmsg_recvmsg_cleanup, 48962306a36Sopenharmony_ci .fail = io_sendrecv_fail, 49062306a36Sopenharmony_ci#endif 49162306a36Sopenharmony_ci }, 49262306a36Sopenharmony_ci [IORING_OP_TIMEOUT] = { 49362306a36Sopenharmony_ci .async_size = sizeof(struct io_timeout_data), 49462306a36Sopenharmony_ci .name = "TIMEOUT", 49562306a36Sopenharmony_ci }, 49662306a36Sopenharmony_ci [IORING_OP_TIMEOUT_REMOVE] = { 49762306a36Sopenharmony_ci .name = "TIMEOUT_REMOVE", 49862306a36Sopenharmony_ci }, 49962306a36Sopenharmony_ci [IORING_OP_ACCEPT] = { 50062306a36Sopenharmony_ci .name = "ACCEPT", 50162306a36Sopenharmony_ci }, 50262306a36Sopenharmony_ci [IORING_OP_ASYNC_CANCEL] = { 50362306a36Sopenharmony_ci .name = "ASYNC_CANCEL", 50462306a36Sopenharmony_ci }, 50562306a36Sopenharmony_ci [IORING_OP_LINK_TIMEOUT] = { 50662306a36Sopenharmony_ci .async_size = sizeof(struct io_timeout_data), 50762306a36Sopenharmony_ci .name = "LINK_TIMEOUT", 50862306a36Sopenharmony_ci }, 50962306a36Sopenharmony_ci [IORING_OP_CONNECT] = { 51062306a36Sopenharmony_ci .name = "CONNECT", 51162306a36Sopenharmony_ci#if defined(CONFIG_NET) 51262306a36Sopenharmony_ci .async_size = sizeof(struct io_async_connect), 51362306a36Sopenharmony_ci .prep_async = io_connect_prep_async, 51462306a36Sopenharmony_ci#endif 51562306a36Sopenharmony_ci }, 51662306a36Sopenharmony_ci [IORING_OP_FALLOCATE] = { 51762306a36Sopenharmony_ci .name = "FALLOCATE", 51862306a36Sopenharmony_ci }, 51962306a36Sopenharmony_ci [IORING_OP_OPENAT] = { 52062306a36Sopenharmony_ci .name = "OPENAT", 52162306a36Sopenharmony_ci .cleanup = io_open_cleanup, 52262306a36Sopenharmony_ci }, 52362306a36Sopenharmony_ci [IORING_OP_CLOSE] = { 52462306a36Sopenharmony_ci .name = "CLOSE", 52562306a36Sopenharmony_ci }, 52662306a36Sopenharmony_ci [IORING_OP_FILES_UPDATE] = { 52762306a36Sopenharmony_ci .name = "FILES_UPDATE", 52862306a36Sopenharmony_ci }, 52962306a36Sopenharmony_ci [IORING_OP_STATX] = { 53062306a36Sopenharmony_ci .name = "STATX", 53162306a36Sopenharmony_ci .cleanup = io_statx_cleanup, 53262306a36Sopenharmony_ci }, 53362306a36Sopenharmony_ci [IORING_OP_READ] = { 53462306a36Sopenharmony_ci .async_size = sizeof(struct io_async_rw), 53562306a36Sopenharmony_ci .name = "READ", 53662306a36Sopenharmony_ci .fail = io_rw_fail, 53762306a36Sopenharmony_ci }, 53862306a36Sopenharmony_ci [IORING_OP_WRITE] = { 53962306a36Sopenharmony_ci .async_size = sizeof(struct io_async_rw), 54062306a36Sopenharmony_ci .name = "WRITE", 54162306a36Sopenharmony_ci .fail = io_rw_fail, 54262306a36Sopenharmony_ci }, 54362306a36Sopenharmony_ci [IORING_OP_FADVISE] = { 54462306a36Sopenharmony_ci .name = "FADVISE", 54562306a36Sopenharmony_ci }, 54662306a36Sopenharmony_ci [IORING_OP_MADVISE] = { 54762306a36Sopenharmony_ci .name = "MADVISE", 54862306a36Sopenharmony_ci }, 54962306a36Sopenharmony_ci [IORING_OP_SEND] = { 55062306a36Sopenharmony_ci .name = "SEND", 55162306a36Sopenharmony_ci#if defined(CONFIG_NET) 55262306a36Sopenharmony_ci .async_size = sizeof(struct io_async_msghdr), 55362306a36Sopenharmony_ci .fail = io_sendrecv_fail, 55462306a36Sopenharmony_ci .prep_async = io_send_prep_async, 55562306a36Sopenharmony_ci#endif 55662306a36Sopenharmony_ci }, 55762306a36Sopenharmony_ci [IORING_OP_RECV] = { 55862306a36Sopenharmony_ci .name = "RECV", 55962306a36Sopenharmony_ci#if defined(CONFIG_NET) 56062306a36Sopenharmony_ci .fail = io_sendrecv_fail, 56162306a36Sopenharmony_ci#endif 56262306a36Sopenharmony_ci }, 56362306a36Sopenharmony_ci [IORING_OP_OPENAT2] = { 56462306a36Sopenharmony_ci .name = "OPENAT2", 56562306a36Sopenharmony_ci .cleanup = io_open_cleanup, 56662306a36Sopenharmony_ci }, 56762306a36Sopenharmony_ci [IORING_OP_EPOLL_CTL] = { 56862306a36Sopenharmony_ci .name = "EPOLL", 56962306a36Sopenharmony_ci }, 57062306a36Sopenharmony_ci [IORING_OP_SPLICE] = { 57162306a36Sopenharmony_ci .name = "SPLICE", 57262306a36Sopenharmony_ci }, 57362306a36Sopenharmony_ci [IORING_OP_PROVIDE_BUFFERS] = { 57462306a36Sopenharmony_ci .name = "PROVIDE_BUFFERS", 57562306a36Sopenharmony_ci }, 57662306a36Sopenharmony_ci [IORING_OP_REMOVE_BUFFERS] = { 57762306a36Sopenharmony_ci .name = "REMOVE_BUFFERS", 57862306a36Sopenharmony_ci }, 57962306a36Sopenharmony_ci [IORING_OP_TEE] = { 58062306a36Sopenharmony_ci .name = "TEE", 58162306a36Sopenharmony_ci }, 58262306a36Sopenharmony_ci [IORING_OP_SHUTDOWN] = { 58362306a36Sopenharmony_ci .name = "SHUTDOWN", 58462306a36Sopenharmony_ci }, 58562306a36Sopenharmony_ci [IORING_OP_RENAMEAT] = { 58662306a36Sopenharmony_ci .name = "RENAMEAT", 58762306a36Sopenharmony_ci .cleanup = io_renameat_cleanup, 58862306a36Sopenharmony_ci }, 58962306a36Sopenharmony_ci [IORING_OP_UNLINKAT] = { 59062306a36Sopenharmony_ci .name = "UNLINKAT", 59162306a36Sopenharmony_ci .cleanup = io_unlinkat_cleanup, 59262306a36Sopenharmony_ci }, 59362306a36Sopenharmony_ci [IORING_OP_MKDIRAT] = { 59462306a36Sopenharmony_ci .name = "MKDIRAT", 59562306a36Sopenharmony_ci .cleanup = io_mkdirat_cleanup, 59662306a36Sopenharmony_ci }, 59762306a36Sopenharmony_ci [IORING_OP_SYMLINKAT] = { 59862306a36Sopenharmony_ci .name = "SYMLINKAT", 59962306a36Sopenharmony_ci .cleanup = io_link_cleanup, 60062306a36Sopenharmony_ci }, 60162306a36Sopenharmony_ci [IORING_OP_LINKAT] = { 60262306a36Sopenharmony_ci .name = "LINKAT", 60362306a36Sopenharmony_ci .cleanup = io_link_cleanup, 60462306a36Sopenharmony_ci }, 60562306a36Sopenharmony_ci [IORING_OP_MSG_RING] = { 60662306a36Sopenharmony_ci .name = "MSG_RING", 60762306a36Sopenharmony_ci .cleanup = io_msg_ring_cleanup, 60862306a36Sopenharmony_ci }, 60962306a36Sopenharmony_ci [IORING_OP_FSETXATTR] = { 61062306a36Sopenharmony_ci .name = "FSETXATTR", 61162306a36Sopenharmony_ci .cleanup = io_xattr_cleanup, 61262306a36Sopenharmony_ci }, 61362306a36Sopenharmony_ci [IORING_OP_SETXATTR] = { 61462306a36Sopenharmony_ci .name = "SETXATTR", 61562306a36Sopenharmony_ci .cleanup = io_xattr_cleanup, 61662306a36Sopenharmony_ci }, 61762306a36Sopenharmony_ci [IORING_OP_FGETXATTR] = { 61862306a36Sopenharmony_ci .name = "FGETXATTR", 61962306a36Sopenharmony_ci .cleanup = io_xattr_cleanup, 62062306a36Sopenharmony_ci }, 62162306a36Sopenharmony_ci [IORING_OP_GETXATTR] = { 62262306a36Sopenharmony_ci .name = "GETXATTR", 62362306a36Sopenharmony_ci .cleanup = io_xattr_cleanup, 62462306a36Sopenharmony_ci }, 62562306a36Sopenharmony_ci [IORING_OP_SOCKET] = { 62662306a36Sopenharmony_ci .name = "SOCKET", 62762306a36Sopenharmony_ci }, 62862306a36Sopenharmony_ci [IORING_OP_URING_CMD] = { 62962306a36Sopenharmony_ci .name = "URING_CMD", 63062306a36Sopenharmony_ci .async_size = 2 * sizeof(struct io_uring_sqe), 63162306a36Sopenharmony_ci .prep_async = io_uring_cmd_prep_async, 63262306a36Sopenharmony_ci }, 63362306a36Sopenharmony_ci [IORING_OP_SEND_ZC] = { 63462306a36Sopenharmony_ci .name = "SEND_ZC", 63562306a36Sopenharmony_ci#if defined(CONFIG_NET) 63662306a36Sopenharmony_ci .async_size = sizeof(struct io_async_msghdr), 63762306a36Sopenharmony_ci .prep_async = io_send_prep_async, 63862306a36Sopenharmony_ci .cleanup = io_send_zc_cleanup, 63962306a36Sopenharmony_ci .fail = io_sendrecv_fail, 64062306a36Sopenharmony_ci#endif 64162306a36Sopenharmony_ci }, 64262306a36Sopenharmony_ci [IORING_OP_SENDMSG_ZC] = { 64362306a36Sopenharmony_ci .name = "SENDMSG_ZC", 64462306a36Sopenharmony_ci#if defined(CONFIG_NET) 64562306a36Sopenharmony_ci .async_size = sizeof(struct io_async_msghdr), 64662306a36Sopenharmony_ci .prep_async = io_sendmsg_prep_async, 64762306a36Sopenharmony_ci .cleanup = io_send_zc_cleanup, 64862306a36Sopenharmony_ci .fail = io_sendrecv_fail, 64962306a36Sopenharmony_ci#endif 65062306a36Sopenharmony_ci }, 65162306a36Sopenharmony_ci}; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ciconst char *io_uring_get_opcode(u8 opcode) 65462306a36Sopenharmony_ci{ 65562306a36Sopenharmony_ci if (opcode < IORING_OP_LAST) 65662306a36Sopenharmony_ci return io_cold_defs[opcode].name; 65762306a36Sopenharmony_ci return "INVALID"; 65862306a36Sopenharmony_ci} 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_civoid __init io_uring_optable_init(void) 66162306a36Sopenharmony_ci{ 66262306a36Sopenharmony_ci int i; 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci BUILD_BUG_ON(ARRAY_SIZE(io_cold_defs) != IORING_OP_LAST); 66562306a36Sopenharmony_ci BUILD_BUG_ON(ARRAY_SIZE(io_issue_defs) != IORING_OP_LAST); 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(io_issue_defs); i++) { 66862306a36Sopenharmony_ci BUG_ON(!io_issue_defs[i].prep); 66962306a36Sopenharmony_ci if (io_issue_defs[i].prep != io_eopnotsupp_prep) 67062306a36Sopenharmony_ci BUG_ON(!io_issue_defs[i].issue); 67162306a36Sopenharmony_ci WARN_ON_ONCE(!io_cold_defs[i].name); 67262306a36Sopenharmony_ci } 67362306a36Sopenharmony_ci} 674