diff options
Diffstat (limited to 'io_uring/nop.c')
| -rw-r--r-- | io_uring/nop.c | 26 | 
1 files changed, 22 insertions, 4 deletions
diff --git a/io_uring/nop.c b/io_uring/nop.c index d956599a3c1b..a5bcf3d6984f 100644 --- a/io_uring/nop.c +++ b/io_uring/nop.c @@ -10,16 +10,34 @@  #include "io_uring.h"  #include "nop.h" +struct io_nop { +	/* NOTE: kiocb has the file as the first member, so don't do it here */ +	struct file     *file; +	int             result; +}; +  int io_nop_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)  { +	unsigned int flags; +	struct io_nop *nop = io_kiocb_to_cmd(req, struct io_nop); + +	flags = READ_ONCE(sqe->nop_flags); +	if (flags & ~IORING_NOP_INJECT_RESULT) +		return -EINVAL; + +	if (flags & IORING_NOP_INJECT_RESULT) +		nop->result = READ_ONCE(sqe->len); +	else +		nop->result = 0;  	return 0;  } -/* - * IORING_OP_NOP just posts a completion event, nothing else. - */  int io_nop(struct io_kiocb *req, unsigned int issue_flags)  { -	io_req_set_res(req, 0, 0); +	struct io_nop *nop = io_kiocb_to_cmd(req, struct io_nop); + +	if (nop->result < 0) +		req_set_fail(req); +	io_req_set_res(req, nop->result, 0);  	return IOU_OK;  }  |