Re: FAILED: patch "[PATCH] io_uring: fix provided buffer import" failed to apply to 5.18-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2022-07-04 at 15:24 +0200, gregkh@xxxxxxxxxxxxxxxxxxx wrote:
> 
> The patch below does not apply to the 5.18-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git
> commit
> id to <stable@xxxxxxxxxxxxxxx>.
> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> From 09007af2b627f0f195c6c53c4829b285cc3990ec Mon Sep 17 00:00:00
> 2001
> From: Dylan Yudaken <dylany@xxxxxx>
> Date: Thu, 30 Jun 2022 06:20:06 -0700
> Subject: [PATCH] io_uring: fix provided buffer import
> 
> io_import_iovec uses the s pointer, but this was changed immediately
> after the iovec was re-imported and so it was imported into the wrong
> place.
> 
> Change the ordering.
> 
> Fixes: 2be2eb02e2f5 ("io_uring: ensure reads re-import for selected
> buffers")
> Signed-off-by: Dylan Yudaken <dylany@xxxxxx>
> Link:
> https://lore.kernel.org/r/20220630132006.2825668-1-dylany@xxxxxx
> [axboe: ensure we don't half-import as well]
> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
> 
> diff --git a/fs/io_uring.c b/fs/io_uring.c
> index aeb042ba5cc5..0d491ad15b66 100644
> --- a/fs/io_uring.c
> +++ b/fs/io_uring.c
> @@ -4318,18 +4318,19 @@ static int io_read(struct io_kiocb *req,
> unsigned int issue_flags)
>                 if (unlikely(ret < 0))
>                         return ret;
>         } else {
> +               rw = req->async_data;
> +               s = &rw->s;
> +
>                 /*
>                  * Safe and required to re-import if we're using
> provided
>                  * buffers, as we dropped the selected one before
> retry.
>                  */
> -               if (req->flags & REQ_F_BUFFER_SELECT) {
> +               if (io_do_buffer_select(req)) {
>                         ret = io_import_iovec(READ, req, &iovec, s,
> issue_flags);
>                         if (unlikely(ret < 0))
>                                 return ret;
>                 }
>  
> -               rw = req->async_data;
> -               s = &rw->s;
>                 /*
>                  * We come here from an earlier attempt, restore our
> state to
>                  * match in case it doesn't. It's cheap enough that
> we don't
> 

Hi,

I have attached a fixed patch which fixes the problem on 5.18

Thanks,
Dylan


From 48e76e81093dc2e4e7f2fd2d95f0a39c1078e7bd Mon Sep 17 00:00:00 2001
From: Dylan Yudaken <dylany@xxxxxx>
Date: Thu, 30 Jun 2022 06:20:06 -0700
Subject: [PATCH] io_uring: fix provided buffer import

commit 09007af2b627f0f195c6c53c4829b285cc3990ec upstream.

io_import_iovec uses the s pointer, but this was changed immediately
after the iovec was re-imported and so it was imported into the wrong
place.

Change the ordering.

Fixes: 2be2eb02e2f5 ("io_uring: ensure reads re-import for selected buffers")
Signed-off-by: Dylan Yudaken <dylany@xxxxxx>
Link: https://lore.kernel.org/r/20220630132006.2825668-1-dylany@xxxxxx
[axboe: ensure we don't half-import as well]
Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
---
 fs/io_uring.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 7c190e885340..4d488ffb297c 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -3495,6 +3495,13 @@ static ssize_t io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov,
 	return __io_iov_buffer_select(req, iov, issue_flags);
 }
 
+static inline bool io_do_buffer_select(struct io_kiocb *req)
+{
+	if (!(req->flags & REQ_F_BUFFER_SELECT))
+		return false;
+	return !(req->flags & REQ_F_BUFFER_SELECTED);
+}
+
 static struct iovec *__io_import_iovec(int rw, struct io_kiocb *req,
 				       struct io_rw_state *s,
 				       unsigned int issue_flags)
@@ -3854,18 +3861,19 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
 		if (unlikely(ret < 0))
 			return ret;
 	} else {
+		rw = req->async_data;
+		s = &rw->s;
+
 		/*
 		 * Safe and required to re-import if we're using provided
 		 * buffers, as we dropped the selected one before retry.
 		 */
-		if (req->flags & REQ_F_BUFFER_SELECT) {
+		if (io_do_buffer_select(req)) {
 			ret = io_import_iovec(READ, req, &iovec, s, issue_flags);
 			if (unlikely(ret < 0))
 				return ret;
 		}
 
-		rw = req->async_data;
-		s = &rw->s;
 		/*
 		 * We come here from an earlier attempt, restore our state to
 		 * match in case it doesn't. It's cheap enough that we don't

base-commit: 64ef7e725db41552c219a155ab8c1f6caf2e7cb4
-- 
2.30.2


[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux