xref: /linux/io_uring/opdef.c (revision 3a4689ac109f18f23ea0d0c1c79e055142796858)
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