Contributors: 9
| Author |
Tokens |
Token Proportion |
Commits |
Commit Proportion |
| Jens Axboe |
333 |
72.39% |
11 |
45.83% |
| Ming Lei |
94 |
20.43% |
2 |
8.33% |
| Vasileios Almpanis |
10 |
2.17% |
1 |
4.17% |
| Linus Torvalds (pre-git) |
9 |
1.96% |
5 |
20.83% |
| Caleb Sander |
6 |
1.30% |
1 |
4.17% |
| Peter Chubb |
3 |
0.65% |
1 |
4.17% |
| Alexander A. Klimov |
2 |
0.43% |
1 |
4.17% |
| Keith Busch |
2 |
0.43% |
1 |
4.17% |
| Greg Kroah-Hartman |
1 |
0.22% |
1 |
4.17% |
| Total |
460 |
|
24 |
|
// SPDX-License-Identifier: GPL-2.0
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/io_uring.h>
#include <uapi/linux/io_uring.h>
#include "io_uring.h"
#include "rsrc.h"
#include "nop.h"
struct io_nop {
struct file *file;
int result;
int fd;
unsigned int flags;
__u64 extra1;
__u64 extra2;
};
#define NOP_FLAGS (IORING_NOP_INJECT_RESULT | IORING_NOP_FIXED_FILE | \
IORING_NOP_FIXED_BUFFER | IORING_NOP_FILE | \
IORING_NOP_TW | IORING_NOP_CQE32)
int io_nop_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_nop *nop = io_kiocb_to_cmd(req, struct io_nop);
nop->flags = READ_ONCE(sqe->nop_flags);
if (nop->flags & ~NOP_FLAGS)
return -EINVAL;
if (nop->flags & IORING_NOP_INJECT_RESULT)
nop->result = READ_ONCE(sqe->len);
else
nop->result = 0;
if (nop->flags & IORING_NOP_FILE)
nop->fd = READ_ONCE(sqe->fd);
else
nop->fd = -1;
if (nop->flags & IORING_NOP_FIXED_FILE)
req->flags |= REQ_F_FIXED_FILE;
if (nop->flags & IORING_NOP_FIXED_BUFFER)
req->buf_index = READ_ONCE(sqe->buf_index);
if (nop->flags & IORING_NOP_CQE32) {
struct io_ring_ctx *ctx = req->ctx;
if (!(ctx->flags & (IORING_SETUP_CQE32|IORING_SETUP_CQE_MIXED)))
return -EINVAL;
nop->extra1 = READ_ONCE(sqe->off);
nop->extra2 = READ_ONCE(sqe->addr);
}
return 0;
}
int io_nop(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_nop *nop = io_kiocb_to_cmd(req, struct io_nop);
int ret = nop->result;
if (nop->flags & IORING_NOP_FILE) {
if (req->flags & REQ_F_FIXED_FILE)
req->file = io_file_get_fixed(req, nop->fd, issue_flags);
else
req->file = io_file_get_normal(req, nop->fd);
if (!req->file) {
ret = -EBADF;
goto done;
}
}
if (nop->flags & IORING_NOP_FIXED_BUFFER) {
if (!io_find_buf_node(req, issue_flags))
ret = -EFAULT;
}
done:
if (ret < 0)
req_set_fail(req);
if (nop->flags & IORING_NOP_CQE32)
io_req_set_res32(req, ret, 0, nop->extra1, nop->extra2);
else
io_req_set_res(req, ret, 0);
if (nop->flags & IORING_NOP_TW) {
req->io_task_work.func = io_req_task_complete;
io_req_task_work_add(req);
return IOU_ISSUE_SKIP_COMPLETE;
}
return IOU_COMPLETE;
}