mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 21:35:07 +00:00
io_uring: hand code io_accept() fd installing
Make io_accept() to handle file descriptor allocations and installation. A preparation patch for bypassing file tables. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk> Link: https://lore.kernel.org/r/5b73d204caa0ce979ccb98136695b60f52a3d98c.1629888991.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
b9445598d8
commit
a7083ad5e3
@ -4810,6 +4810,11 @@ static int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
||||
accept->addr_len = u64_to_user_ptr(READ_ONCE(sqe->addr2));
|
||||
accept->flags = READ_ONCE(sqe->accept_flags);
|
||||
accept->nofile = rlimit(RLIMIT_NOFILE);
|
||||
|
||||
if (accept->flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
|
||||
return -EINVAL;
|
||||
if (SOCK_NONBLOCK != O_NONBLOCK && (accept->flags & SOCK_NONBLOCK))
|
||||
accept->flags = (accept->flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4818,20 +4823,28 @@ static int io_accept(struct io_kiocb *req, unsigned int issue_flags)
|
||||
struct io_accept *accept = &req->accept;
|
||||
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
|
||||
unsigned int file_flags = force_nonblock ? O_NONBLOCK : 0;
|
||||
int ret;
|
||||
struct file *file;
|
||||
int ret, fd;
|
||||
|
||||
if (req->file->f_flags & O_NONBLOCK)
|
||||
req->flags |= REQ_F_NOWAIT;
|
||||
|
||||
ret = __sys_accept4_file(req->file, file_flags, accept->addr,
|
||||
accept->addr_len, accept->flags,
|
||||
accept->nofile);
|
||||
if (ret == -EAGAIN && force_nonblock)
|
||||
return -EAGAIN;
|
||||
if (ret < 0) {
|
||||
fd = __get_unused_fd_flags(accept->flags, accept->nofile);
|
||||
if (unlikely(fd < 0))
|
||||
return fd;
|
||||
|
||||
file = do_accept(req->file, file_flags, accept->addr, accept->addr_len,
|
||||
accept->flags);
|
||||
if (IS_ERR(file)) {
|
||||
ret = PTR_ERR(file);
|
||||
if (ret == -EAGAIN && force_nonblock)
|
||||
return -EAGAIN;
|
||||
if (ret == -ERESTARTSYS)
|
||||
ret = -EINTR;
|
||||
req_set_fail(req);
|
||||
} else {
|
||||
fd_install(fd, file);
|
||||
ret = fd;
|
||||
}
|
||||
__io_req_complete(req, issue_flags, ret, 0);
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user