diff mbox series

[for-next] io_uring: add fully sparse buffer registration

Message ID 66f429e4912fe39fb3318217ff33a2853d4544be.1652879898.git.asml.silence@gmail.com (mailing list archive)
State New
Headers show
Series [for-next] io_uring: add fully sparse buffer registration | expand

Commit Message

Pavel Begunkov May 18, 2022, 6:13 p.m. UTC
Honour IORING_RSRC_REGISTER_SPARSE not only for direct files but fixed
buffers as well. It makes the rsrc API more consistent.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 fs/io_uring.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

Comments

Jens Axboe May 18, 2022, 6:25 p.m. UTC | #1
On 5/18/22 12:13 PM, Pavel Begunkov wrote:
> Honour IORING_RSRC_REGISTER_SPARSE not only for direct files but fixed
> buffers as well. It makes the rsrc API more consistent.

Was thinking about that as well when doing the file side, agree we
should do it. Thanks!
Jens Axboe May 18, 2022, 6:53 p.m. UTC | #2
On Wed, 18 May 2022 19:13:49 +0100, Pavel Begunkov wrote:
> Honour IORING_RSRC_REGISTER_SPARSE not only for direct files but fixed
> buffers as well. It makes the rsrc API more consistent.
> 
> 

Applied, thanks!

[1/1] io_uring: add fully sparse buffer registration
      commit: 0184f08e65348f39aa4e8a71927e4538515f4ac0

Best regards,
diff mbox series

Patch

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 8b232bde32bf..eeb894abbae4 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -10141,12 +10141,17 @@  static int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
 	}
 
 	for (i = 0; i < nr_args; i++, ctx->nr_user_bufs++) {
-		ret = io_copy_iov(ctx, &iov, arg, i);
-		if (ret)
-			break;
-		ret = io_buffer_validate(&iov);
-		if (ret)
-			break;
+		if (arg) {
+			ret = io_copy_iov(ctx, &iov, arg, i);
+			if (ret)
+				break;
+			ret = io_buffer_validate(&iov);
+			if (ret)
+				break;
+		} else {
+			memset(&iov, 0, sizeof(iov));
+		}
+
 		if (!iov.iov_base && *io_get_tag_slot(data, i)) {
 			ret = -EINVAL;
 			break;
@@ -11993,7 +11998,7 @@  static __cold int io_register_rsrc(struct io_ring_ctx *ctx, void __user *arg,
 		return io_sqe_files_register(ctx, u64_to_user_ptr(rr.data),
 					     rr.nr, u64_to_user_ptr(rr.tags));
 	case IORING_RSRC_BUFFER:
-		if (rr.flags & IORING_RSRC_REGISTER_SPARSE)
+		if (rr.flags & IORING_RSRC_REGISTER_SPARSE && rr.data)
 			break;
 		return io_sqe_buffers_register(ctx, u64_to_user_ptr(rr.data),
 					       rr.nr, u64_to_user_ptr(rr.tags));
@@ -12231,6 +12236,9 @@  static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
 
 	switch (opcode) {
 	case IORING_REGISTER_BUFFERS:
+		ret = -EFAULT;
+		if (!arg)
+			break;
 		ret = io_sqe_buffers_register(ctx, arg, nr_args, NULL);
 		break;
 	case IORING_UNREGISTER_BUFFERS: