ionic: update documentation for XDP support
[sfrench/cifs-2.6.git] / io_uring / opdef.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * io_uring opcode handling table
4  */
5 #include <linux/kernel.h>
6 #include <linux/errno.h>
7 #include <linux/fs.h>
8 #include <linux/file.h>
9 #include <linux/io_uring.h>
10
11 #include "io_uring.h"
12 #include "opdef.h"
13 #include "refs.h"
14 #include "tctx.h"
15 #include "sqpoll.h"
16 #include "fdinfo.h"
17 #include "kbuf.h"
18 #include "rsrc.h"
19
20 #include "xattr.h"
21 #include "nop.h"
22 #include "fs.h"
23 #include "splice.h"
24 #include "sync.h"
25 #include "advise.h"
26 #include "openclose.h"
27 #include "uring_cmd.h"
28 #include "epoll.h"
29 #include "statx.h"
30 #include "net.h"
31 #include "msg_ring.h"
32 #include "timeout.h"
33 #include "poll.h"
34 #include "cancel.h"
35 #include "rw.h"
36 #include "waitid.h"
37 #include "futex.h"
38 #include "truncate.h"
39
40 static int io_no_issue(struct io_kiocb *req, unsigned int issue_flags)
41 {
42         WARN_ON_ONCE(1);
43         return -ECANCELED;
44 }
45
46 static __maybe_unused int io_eopnotsupp_prep(struct io_kiocb *kiocb,
47                                              const struct io_uring_sqe *sqe)
48 {
49         return -EOPNOTSUPP;
50 }
51
52 const struct io_issue_def io_issue_defs[] = {
53         [IORING_OP_NOP] = {
54                 .audit_skip             = 1,
55                 .iopoll                 = 1,
56                 .prep                   = io_nop_prep,
57                 .issue                  = io_nop,
58         },
59         [IORING_OP_READV] = {
60                 .needs_file             = 1,
61                 .unbound_nonreg_file    = 1,
62                 .pollin                 = 1,
63                 .buffer_select          = 1,
64                 .plug                   = 1,
65                 .audit_skip             = 1,
66                 .ioprio                 = 1,
67                 .iopoll                 = 1,
68                 .iopoll_queue           = 1,
69                 .vectored               = 1,
70                 .prep                   = io_prep_rwv,
71                 .issue                  = io_read,
72         },
73         [IORING_OP_WRITEV] = {
74                 .needs_file             = 1,
75                 .hash_reg_file          = 1,
76                 .unbound_nonreg_file    = 1,
77                 .pollout                = 1,
78                 .plug                   = 1,
79                 .audit_skip             = 1,
80                 .ioprio                 = 1,
81                 .iopoll                 = 1,
82                 .iopoll_queue           = 1,
83                 .vectored               = 1,
84                 .prep                   = io_prep_rwv,
85                 .issue                  = io_write,
86         },
87         [IORING_OP_FSYNC] = {
88                 .needs_file             = 1,
89                 .audit_skip             = 1,
90                 .prep                   = io_fsync_prep,
91                 .issue                  = io_fsync,
92         },
93         [IORING_OP_READ_FIXED] = {
94                 .needs_file             = 1,
95                 .unbound_nonreg_file    = 1,
96                 .pollin                 = 1,
97                 .plug                   = 1,
98                 .audit_skip             = 1,
99                 .ioprio                 = 1,
100                 .iopoll                 = 1,
101                 .iopoll_queue           = 1,
102                 .prep                   = io_prep_rw_fixed,
103                 .issue                  = io_read,
104         },
105         [IORING_OP_WRITE_FIXED] = {
106                 .needs_file             = 1,
107                 .hash_reg_file          = 1,
108                 .unbound_nonreg_file    = 1,
109                 .pollout                = 1,
110                 .plug                   = 1,
111                 .audit_skip             = 1,
112                 .ioprio                 = 1,
113                 .iopoll                 = 1,
114                 .iopoll_queue           = 1,
115                 .prep                   = io_prep_rw_fixed,
116                 .issue                  = io_write,
117         },
118         [IORING_OP_POLL_ADD] = {
119                 .needs_file             = 1,
120                 .unbound_nonreg_file    = 1,
121                 .audit_skip             = 1,
122                 .prep                   = io_poll_add_prep,
123                 .issue                  = io_poll_add,
124         },
125         [IORING_OP_POLL_REMOVE] = {
126                 .audit_skip             = 1,
127                 .prep                   = io_poll_remove_prep,
128                 .issue                  = io_poll_remove,
129         },
130         [IORING_OP_SYNC_FILE_RANGE] = {
131                 .needs_file             = 1,
132                 .audit_skip             = 1,
133                 .prep                   = io_sfr_prep,
134                 .issue                  = io_sync_file_range,
135         },
136         [IORING_OP_SENDMSG] = {
137                 .needs_file             = 1,
138                 .unbound_nonreg_file    = 1,
139                 .pollout                = 1,
140                 .ioprio                 = 1,
141                 .manual_alloc           = 1,
142 #if defined(CONFIG_NET)
143                 .prep                   = io_sendmsg_prep,
144                 .issue                  = io_sendmsg,
145 #else
146                 .prep                   = io_eopnotsupp_prep,
147 #endif
148         },
149         [IORING_OP_RECVMSG] = {
150                 .needs_file             = 1,
151                 .unbound_nonreg_file    = 1,
152                 .pollin                 = 1,
153                 .buffer_select          = 1,
154                 .ioprio                 = 1,
155                 .manual_alloc           = 1,
156 #if defined(CONFIG_NET)
157                 .prep                   = io_recvmsg_prep,
158                 .issue                  = io_recvmsg,
159 #else
160                 .prep                   = io_eopnotsupp_prep,
161 #endif
162         },
163         [IORING_OP_TIMEOUT] = {
164                 .audit_skip             = 1,
165                 .prep                   = io_timeout_prep,
166                 .issue                  = io_timeout,
167         },
168         [IORING_OP_TIMEOUT_REMOVE] = {
169                 /* used by timeout updates' prep() */
170                 .audit_skip             = 1,
171                 .prep                   = io_timeout_remove_prep,
172                 .issue                  = io_timeout_remove,
173         },
174         [IORING_OP_ACCEPT] = {
175                 .needs_file             = 1,
176                 .unbound_nonreg_file    = 1,
177                 .pollin                 = 1,
178                 .poll_exclusive         = 1,
179                 .ioprio                 = 1,    /* used for flags */
180 #if defined(CONFIG_NET)
181                 .prep                   = io_accept_prep,
182                 .issue                  = io_accept,
183 #else
184                 .prep                   = io_eopnotsupp_prep,
185 #endif
186         },
187         [IORING_OP_ASYNC_CANCEL] = {
188                 .audit_skip             = 1,
189                 .prep                   = io_async_cancel_prep,
190                 .issue                  = io_async_cancel,
191         },
192         [IORING_OP_LINK_TIMEOUT] = {
193                 .audit_skip             = 1,
194                 .prep                   = io_link_timeout_prep,
195                 .issue                  = io_no_issue,
196         },
197         [IORING_OP_CONNECT] = {
198                 .needs_file             = 1,
199                 .unbound_nonreg_file    = 1,
200                 .pollout                = 1,
201 #if defined(CONFIG_NET)
202                 .prep                   = io_connect_prep,
203                 .issue                  = io_connect,
204 #else
205                 .prep                   = io_eopnotsupp_prep,
206 #endif
207         },
208         [IORING_OP_FALLOCATE] = {
209                 .needs_file             = 1,
210                 .prep                   = io_fallocate_prep,
211                 .issue                  = io_fallocate,
212         },
213         [IORING_OP_OPENAT] = {
214                 .prep                   = io_openat_prep,
215                 .issue                  = io_openat,
216         },
217         [IORING_OP_CLOSE] = {
218                 .prep                   = io_close_prep,
219                 .issue                  = io_close,
220         },
221         [IORING_OP_FILES_UPDATE] = {
222                 .audit_skip             = 1,
223                 .iopoll                 = 1,
224                 .prep                   = io_files_update_prep,
225                 .issue                  = io_files_update,
226         },
227         [IORING_OP_STATX] = {
228                 .audit_skip             = 1,
229                 .prep                   = io_statx_prep,
230                 .issue                  = io_statx,
231         },
232         [IORING_OP_READ] = {
233                 .needs_file             = 1,
234                 .unbound_nonreg_file    = 1,
235                 .pollin                 = 1,
236                 .buffer_select          = 1,
237                 .plug                   = 1,
238                 .audit_skip             = 1,
239                 .ioprio                 = 1,
240                 .iopoll                 = 1,
241                 .iopoll_queue           = 1,
242                 .prep                   = io_prep_rw,
243                 .issue                  = io_read,
244         },
245         [IORING_OP_WRITE] = {
246                 .needs_file             = 1,
247                 .hash_reg_file          = 1,
248                 .unbound_nonreg_file    = 1,
249                 .pollout                = 1,
250                 .plug                   = 1,
251                 .audit_skip             = 1,
252                 .ioprio                 = 1,
253                 .iopoll                 = 1,
254                 .iopoll_queue           = 1,
255                 .prep                   = io_prep_rw,
256                 .issue                  = io_write,
257         },
258         [IORING_OP_FADVISE] = {
259                 .needs_file             = 1,
260                 .audit_skip             = 1,
261                 .prep                   = io_fadvise_prep,
262                 .issue                  = io_fadvise,
263         },
264         [IORING_OP_MADVISE] = {
265                 .audit_skip             = 1,
266                 .prep                   = io_madvise_prep,
267                 .issue                  = io_madvise,
268         },
269         [IORING_OP_SEND] = {
270                 .needs_file             = 1,
271                 .unbound_nonreg_file    = 1,
272                 .pollout                = 1,
273                 .audit_skip             = 1,
274                 .ioprio                 = 1,
275                 .manual_alloc           = 1,
276 #if defined(CONFIG_NET)
277                 .prep                   = io_sendmsg_prep,
278                 .issue                  = io_send,
279 #else
280                 .prep                   = io_eopnotsupp_prep,
281 #endif
282         },
283         [IORING_OP_RECV] = {
284                 .needs_file             = 1,
285                 .unbound_nonreg_file    = 1,
286                 .pollin                 = 1,
287                 .buffer_select          = 1,
288                 .audit_skip             = 1,
289                 .ioprio                 = 1,
290 #if defined(CONFIG_NET)
291                 .prep                   = io_recvmsg_prep,
292                 .issue                  = io_recv,
293 #else
294                 .prep                   = io_eopnotsupp_prep,
295 #endif
296         },
297         [IORING_OP_OPENAT2] = {
298                 .prep                   = io_openat2_prep,
299                 .issue                  = io_openat2,
300         },
301         [IORING_OP_EPOLL_CTL] = {
302                 .unbound_nonreg_file    = 1,
303                 .audit_skip             = 1,
304 #if defined(CONFIG_EPOLL)
305                 .prep                   = io_epoll_ctl_prep,
306                 .issue                  = io_epoll_ctl,
307 #else
308                 .prep                   = io_eopnotsupp_prep,
309 #endif
310         },
311         [IORING_OP_SPLICE] = {
312                 .needs_file             = 1,
313                 .hash_reg_file          = 1,
314                 .unbound_nonreg_file    = 1,
315                 .audit_skip             = 1,
316                 .prep                   = io_splice_prep,
317                 .issue                  = io_splice,
318         },
319         [IORING_OP_PROVIDE_BUFFERS] = {
320                 .audit_skip             = 1,
321                 .iopoll                 = 1,
322                 .prep                   = io_provide_buffers_prep,
323                 .issue                  = io_provide_buffers,
324         },
325         [IORING_OP_REMOVE_BUFFERS] = {
326                 .audit_skip             = 1,
327                 .iopoll                 = 1,
328                 .prep                   = io_remove_buffers_prep,
329                 .issue                  = io_remove_buffers,
330         },
331         [IORING_OP_TEE] = {
332                 .needs_file             = 1,
333                 .hash_reg_file          = 1,
334                 .unbound_nonreg_file    = 1,
335                 .audit_skip             = 1,
336                 .prep                   = io_tee_prep,
337                 .issue                  = io_tee,
338         },
339         [IORING_OP_SHUTDOWN] = {
340                 .needs_file             = 1,
341 #if defined(CONFIG_NET)
342                 .prep                   = io_shutdown_prep,
343                 .issue                  = io_shutdown,
344 #else
345                 .prep                   = io_eopnotsupp_prep,
346 #endif
347         },
348         [IORING_OP_RENAMEAT] = {
349                 .prep                   = io_renameat_prep,
350                 .issue                  = io_renameat,
351         },
352         [IORING_OP_UNLINKAT] = {
353                 .prep                   = io_unlinkat_prep,
354                 .issue                  = io_unlinkat,
355         },
356         [IORING_OP_MKDIRAT] = {
357                 .prep                   = io_mkdirat_prep,
358                 .issue                  = io_mkdirat,
359         },
360         [IORING_OP_SYMLINKAT] = {
361                 .prep                   = io_symlinkat_prep,
362                 .issue                  = io_symlinkat,
363         },
364         [IORING_OP_LINKAT] = {
365                 .prep                   = io_linkat_prep,
366                 .issue                  = io_linkat,
367         },
368         [IORING_OP_MSG_RING] = {
369                 .needs_file             = 1,
370                 .iopoll                 = 1,
371                 .prep                   = io_msg_ring_prep,
372                 .issue                  = io_msg_ring,
373         },
374         [IORING_OP_FSETXATTR] = {
375                 .needs_file = 1,
376                 .prep                   = io_fsetxattr_prep,
377                 .issue                  = io_fsetxattr,
378         },
379         [IORING_OP_SETXATTR] = {
380                 .prep                   = io_setxattr_prep,
381                 .issue                  = io_setxattr,
382         },
383         [IORING_OP_FGETXATTR] = {
384                 .needs_file = 1,
385                 .prep                   = io_fgetxattr_prep,
386                 .issue                  = io_fgetxattr,
387         },
388         [IORING_OP_GETXATTR] = {
389                 .prep                   = io_getxattr_prep,
390                 .issue                  = io_getxattr,
391         },
392         [IORING_OP_SOCKET] = {
393                 .audit_skip             = 1,
394 #if defined(CONFIG_NET)
395                 .prep                   = io_socket_prep,
396                 .issue                  = io_socket,
397 #else
398                 .prep                   = io_eopnotsupp_prep,
399 #endif
400         },
401         [IORING_OP_URING_CMD] = {
402                 .needs_file             = 1,
403                 .plug                   = 1,
404                 .iopoll                 = 1,
405                 .iopoll_queue           = 1,
406                 .prep                   = io_uring_cmd_prep,
407                 .issue                  = io_uring_cmd,
408         },
409         [IORING_OP_SEND_ZC] = {
410                 .needs_file             = 1,
411                 .unbound_nonreg_file    = 1,
412                 .pollout                = 1,
413                 .audit_skip             = 1,
414                 .ioprio                 = 1,
415                 .manual_alloc           = 1,
416 #if defined(CONFIG_NET)
417                 .prep                   = io_send_zc_prep,
418                 .issue                  = io_send_zc,
419 #else
420                 .prep                   = io_eopnotsupp_prep,
421 #endif
422         },
423         [IORING_OP_SENDMSG_ZC] = {
424                 .needs_file             = 1,
425                 .unbound_nonreg_file    = 1,
426                 .pollout                = 1,
427                 .ioprio                 = 1,
428                 .manual_alloc           = 1,
429 #if defined(CONFIG_NET)
430                 .prep                   = io_send_zc_prep,
431                 .issue                  = io_sendmsg_zc,
432 #else
433                 .prep                   = io_eopnotsupp_prep,
434 #endif
435         },
436         [IORING_OP_READ_MULTISHOT] = {
437                 .needs_file             = 1,
438                 .unbound_nonreg_file    = 1,
439                 .pollin                 = 1,
440                 .buffer_select          = 1,
441                 .audit_skip             = 1,
442                 .prep                   = io_read_mshot_prep,
443                 .issue                  = io_read_mshot,
444         },
445         [IORING_OP_WAITID] = {
446                 .prep                   = io_waitid_prep,
447                 .issue                  = io_waitid,
448         },
449         [IORING_OP_FUTEX_WAIT] = {
450 #if defined(CONFIG_FUTEX)
451                 .prep                   = io_futex_prep,
452                 .issue                  = io_futex_wait,
453 #else
454                 .prep                   = io_eopnotsupp_prep,
455 #endif
456         },
457         [IORING_OP_FUTEX_WAKE] = {
458 #if defined(CONFIG_FUTEX)
459                 .prep                   = io_futex_prep,
460                 .issue                  = io_futex_wake,
461 #else
462                 .prep                   = io_eopnotsupp_prep,
463 #endif
464         },
465         [IORING_OP_FUTEX_WAITV] = {
466 #if defined(CONFIG_FUTEX)
467                 .prep                   = io_futexv_prep,
468                 .issue                  = io_futexv_wait,
469 #else
470                 .prep                   = io_eopnotsupp_prep,
471 #endif
472         },
473         [IORING_OP_FIXED_FD_INSTALL] = {
474                 .needs_file             = 1,
475                 .prep                   = io_install_fixed_fd_prep,
476                 .issue                  = io_install_fixed_fd,
477         },
478         [IORING_OP_FTRUNCATE] = {
479                 .needs_file             = 1,
480                 .hash_reg_file          = 1,
481                 .prep                   = io_ftruncate_prep,
482                 .issue                  = io_ftruncate,
483         },
484 };
485
486 const struct io_cold_def io_cold_defs[] = {
487         [IORING_OP_NOP] = {
488                 .name                   = "NOP",
489         },
490         [IORING_OP_READV] = {
491                 .async_size             = sizeof(struct io_async_rw),
492                 .name                   = "READV",
493                 .prep_async             = io_readv_prep_async,
494                 .cleanup                = io_readv_writev_cleanup,
495                 .fail                   = io_rw_fail,
496         },
497         [IORING_OP_WRITEV] = {
498                 .async_size             = sizeof(struct io_async_rw),
499                 .name                   = "WRITEV",
500                 .prep_async             = io_writev_prep_async,
501                 .cleanup                = io_readv_writev_cleanup,
502                 .fail                   = io_rw_fail,
503         },
504         [IORING_OP_FSYNC] = {
505                 .name                   = "FSYNC",
506         },
507         [IORING_OP_READ_FIXED] = {
508                 .async_size             = sizeof(struct io_async_rw),
509                 .name                   = "READ_FIXED",
510                 .fail                   = io_rw_fail,
511         },
512         [IORING_OP_WRITE_FIXED] = {
513                 .async_size             = sizeof(struct io_async_rw),
514                 .name                   = "WRITE_FIXED",
515                 .fail                   = io_rw_fail,
516         },
517         [IORING_OP_POLL_ADD] = {
518                 .name                   = "POLL_ADD",
519         },
520         [IORING_OP_POLL_REMOVE] = {
521                 .name                   = "POLL_REMOVE",
522         },
523         [IORING_OP_SYNC_FILE_RANGE] = {
524                 .name                   = "SYNC_FILE_RANGE",
525         },
526         [IORING_OP_SENDMSG] = {
527                 .name                   = "SENDMSG",
528 #if defined(CONFIG_NET)
529                 .async_size             = sizeof(struct io_async_msghdr),
530                 .prep_async             = io_sendmsg_prep_async,
531                 .cleanup                = io_sendmsg_recvmsg_cleanup,
532                 .fail                   = io_sendrecv_fail,
533 #endif
534         },
535         [IORING_OP_RECVMSG] = {
536                 .name                   = "RECVMSG",
537 #if defined(CONFIG_NET)
538                 .async_size             = sizeof(struct io_async_msghdr),
539                 .prep_async             = io_recvmsg_prep_async,
540                 .cleanup                = io_sendmsg_recvmsg_cleanup,
541                 .fail                   = io_sendrecv_fail,
542 #endif
543         },
544         [IORING_OP_TIMEOUT] = {
545                 .async_size             = sizeof(struct io_timeout_data),
546                 .name                   = "TIMEOUT",
547         },
548         [IORING_OP_TIMEOUT_REMOVE] = {
549                 .name                   = "TIMEOUT_REMOVE",
550         },
551         [IORING_OP_ACCEPT] = {
552                 .name                   = "ACCEPT",
553         },
554         [IORING_OP_ASYNC_CANCEL] = {
555                 .name                   = "ASYNC_CANCEL",
556         },
557         [IORING_OP_LINK_TIMEOUT] = {
558                 .async_size             = sizeof(struct io_timeout_data),
559                 .name                   = "LINK_TIMEOUT",
560         },
561         [IORING_OP_CONNECT] = {
562                 .name                   = "CONNECT",
563 #if defined(CONFIG_NET)
564                 .async_size             = sizeof(struct io_async_connect),
565                 .prep_async             = io_connect_prep_async,
566 #endif
567         },
568         [IORING_OP_FALLOCATE] = {
569                 .name                   = "FALLOCATE",
570         },
571         [IORING_OP_OPENAT] = {
572                 .name                   = "OPENAT",
573                 .cleanup                = io_open_cleanup,
574         },
575         [IORING_OP_CLOSE] = {
576                 .name                   = "CLOSE",
577         },
578         [IORING_OP_FILES_UPDATE] = {
579                 .name                   = "FILES_UPDATE",
580         },
581         [IORING_OP_STATX] = {
582                 .name                   = "STATX",
583                 .cleanup                = io_statx_cleanup,
584         },
585         [IORING_OP_READ] = {
586                 .async_size             = sizeof(struct io_async_rw),
587                 .name                   = "READ",
588                 .fail                   = io_rw_fail,
589         },
590         [IORING_OP_WRITE] = {
591                 .async_size             = sizeof(struct io_async_rw),
592                 .name                   = "WRITE",
593                 .fail                   = io_rw_fail,
594         },
595         [IORING_OP_FADVISE] = {
596                 .name                   = "FADVISE",
597         },
598         [IORING_OP_MADVISE] = {
599                 .name                   = "MADVISE",
600         },
601         [IORING_OP_SEND] = {
602                 .name                   = "SEND",
603 #if defined(CONFIG_NET)
604                 .async_size             = sizeof(struct io_async_msghdr),
605                 .fail                   = io_sendrecv_fail,
606                 .prep_async             = io_send_prep_async,
607 #endif
608         },
609         [IORING_OP_RECV] = {
610                 .name                   = "RECV",
611 #if defined(CONFIG_NET)
612                 .fail                   = io_sendrecv_fail,
613 #endif
614         },
615         [IORING_OP_OPENAT2] = {
616                 .name                   = "OPENAT2",
617                 .cleanup                = io_open_cleanup,
618         },
619         [IORING_OP_EPOLL_CTL] = {
620                 .name                   = "EPOLL",
621         },
622         [IORING_OP_SPLICE] = {
623                 .name                   = "SPLICE",
624         },
625         [IORING_OP_PROVIDE_BUFFERS] = {
626                 .name                   = "PROVIDE_BUFFERS",
627         },
628         [IORING_OP_REMOVE_BUFFERS] = {
629                 .name                   = "REMOVE_BUFFERS",
630         },
631         [IORING_OP_TEE] = {
632                 .name                   = "TEE",
633         },
634         [IORING_OP_SHUTDOWN] = {
635                 .name                   = "SHUTDOWN",
636         },
637         [IORING_OP_RENAMEAT] = {
638                 .name                   = "RENAMEAT",
639                 .cleanup                = io_renameat_cleanup,
640         },
641         [IORING_OP_UNLINKAT] = {
642                 .name                   = "UNLINKAT",
643                 .cleanup                = io_unlinkat_cleanup,
644         },
645         [IORING_OP_MKDIRAT] = {
646                 .name                   = "MKDIRAT",
647                 .cleanup                = io_mkdirat_cleanup,
648         },
649         [IORING_OP_SYMLINKAT] = {
650                 .name                   = "SYMLINKAT",
651                 .cleanup                = io_link_cleanup,
652         },
653         [IORING_OP_LINKAT] = {
654                 .name                   = "LINKAT",
655                 .cleanup                = io_link_cleanup,
656         },
657         [IORING_OP_MSG_RING] = {
658                 .name                   = "MSG_RING",
659                 .cleanup                = io_msg_ring_cleanup,
660         },
661         [IORING_OP_FSETXATTR] = {
662                 .name                   = "FSETXATTR",
663                 .cleanup                = io_xattr_cleanup,
664         },
665         [IORING_OP_SETXATTR] = {
666                 .name                   = "SETXATTR",
667                 .cleanup                = io_xattr_cleanup,
668         },
669         [IORING_OP_FGETXATTR] = {
670                 .name                   = "FGETXATTR",
671                 .cleanup                = io_xattr_cleanup,
672         },
673         [IORING_OP_GETXATTR] = {
674                 .name                   = "GETXATTR",
675                 .cleanup                = io_xattr_cleanup,
676         },
677         [IORING_OP_SOCKET] = {
678                 .name                   = "SOCKET",
679         },
680         [IORING_OP_URING_CMD] = {
681                 .name                   = "URING_CMD",
682                 .async_size             = 2 * sizeof(struct io_uring_sqe),
683                 .prep_async             = io_uring_cmd_prep_async,
684         },
685         [IORING_OP_SEND_ZC] = {
686                 .name                   = "SEND_ZC",
687 #if defined(CONFIG_NET)
688                 .async_size             = sizeof(struct io_async_msghdr),
689                 .prep_async             = io_send_prep_async,
690                 .cleanup                = io_send_zc_cleanup,
691                 .fail                   = io_sendrecv_fail,
692 #endif
693         },
694         [IORING_OP_SENDMSG_ZC] = {
695                 .name                   = "SENDMSG_ZC",
696 #if defined(CONFIG_NET)
697                 .async_size             = sizeof(struct io_async_msghdr),
698                 .prep_async             = io_sendmsg_prep_async,
699                 .cleanup                = io_send_zc_cleanup,
700                 .fail                   = io_sendrecv_fail,
701 #endif
702         },
703         [IORING_OP_READ_MULTISHOT] = {
704                 .name                   = "READ_MULTISHOT",
705         },
706         [IORING_OP_WAITID] = {
707                 .name                   = "WAITID",
708                 .async_size             = sizeof(struct io_waitid_async),
709         },
710         [IORING_OP_FUTEX_WAIT] = {
711                 .name                   = "FUTEX_WAIT",
712         },
713         [IORING_OP_FUTEX_WAKE] = {
714                 .name                   = "FUTEX_WAKE",
715         },
716         [IORING_OP_FUTEX_WAITV] = {
717                 .name                   = "FUTEX_WAITV",
718         },
719         [IORING_OP_FIXED_FD_INSTALL] = {
720                 .name                   = "FIXED_FD_INSTALL",
721         },
722         [IORING_OP_FTRUNCATE] = {
723                 .name                   = "FTRUNCATE",
724         },
725 };
726
727 const char *io_uring_get_opcode(u8 opcode)
728 {
729         if (opcode < IORING_OP_LAST)
730                 return io_cold_defs[opcode].name;
731         return "INVALID";
732 }
733
734 void __init io_uring_optable_init(void)
735 {
736         int i;
737
738         BUILD_BUG_ON(ARRAY_SIZE(io_cold_defs) != IORING_OP_LAST);
739         BUILD_BUG_ON(ARRAY_SIZE(io_issue_defs) != IORING_OP_LAST);
740
741         for (i = 0; i < ARRAY_SIZE(io_issue_defs); i++) {
742                 BUG_ON(!io_issue_defs[i].prep);
743                 if (io_issue_defs[i].prep != io_eopnotsupp_prep)
744                         BUG_ON(!io_issue_defs[i].issue);
745                 WARN_ON_ONCE(!io_cold_defs[i].name);
746         }
747 }