1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
3 #include <linux/errno.h>
4 #include <linux/file.h>
6 #include <linux/uaccess.h>
7 #include <linux/io_uring.h>
8 #include <linux/eventpoll.h>
10 #include <uapi/linux/io_uring.h>
15 #if defined(CONFIG_EPOLL)
21 struct epoll_event event
;
24 int io_epoll_ctl_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
)
26 struct io_epoll
*epoll
= io_kiocb_to_cmd(req
, struct io_epoll
);
28 if (sqe
->buf_index
|| sqe
->splice_fd_in
)
31 epoll
->epfd
= READ_ONCE(sqe
->fd
);
32 epoll
->op
= READ_ONCE(sqe
->len
);
33 epoll
->fd
= READ_ONCE(sqe
->off
);
35 if (ep_op_has_event(epoll
->op
)) {
36 struct epoll_event __user
*ev
;
38 ev
= u64_to_user_ptr(READ_ONCE(sqe
->addr
));
39 if (copy_from_user(&epoll
->event
, ev
, sizeof(*ev
)))
46 int io_epoll_ctl(struct io_kiocb
*req
, unsigned int issue_flags
)
48 struct io_epoll
*ie
= io_kiocb_to_cmd(req
, struct io_epoll
);
50 bool force_nonblock
= issue_flags
& IO_URING_F_NONBLOCK
;
52 ret
= do_epoll_ctl(ie
->epfd
, ie
->op
, ie
->fd
, &ie
->event
, force_nonblock
);
53 if (force_nonblock
&& ret
== -EAGAIN
)
58 io_req_set_res(req
, ret
, 0);