From 2cd6618191489fe3fed66ed7978ffc31df04e3e2 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 14 Sep 2020 09:28:14 -0600 Subject: [PATCH 2092/2944] io_uring: don't re-setup vecs/iter in io_resumit_prep() is already there to #29998112 commit 8f3d749685e48c44dbe877ac9781079d85f914c8 upstream If we already have mapped the necessary data for retry, then don't set it up again. It's a pointless operation, and we leak the iovec if it's a large (non-stack) vec. Backport Notes io_setup_async_rw(req, ret, iovec, inline_vecs, &iter) has been changed to io_setup_async_rw(req, iovec, inline_vecs, &iter, false); here keep the old format Fixes: b63534c41e20 ("io_uring: re-issue block requests that failed because of resources") Signed-off-by: Jens Axboe Signed-off-by: Hao Xu Reviewed-by: Joseph Qi --- fs/io_uring.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index 02bcbdf..5fa9517 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2060,13 +2060,17 @@ static bool io_resubmit_prep(struct io_kiocb *req, int error) goto end_req; } - ret = io_import_iovec(rw, req, &iovec, &iter, false); - if (ret < 0) - goto end_req; - ret = io_setup_async_rw(req, ret, iovec, inline_vecs, &iter); - if (!ret) + if (!req->io) { + ret = io_import_iovec(rw, req, &iovec, &iter, false); + if (ret < 0) + goto end_req; + ret = io_setup_async_rw(req, ret, iovec, inline_vecs, &iter); + if (!ret) + return true; + kfree(iovec); + } else { return true; - kfree(iovec); + } end_req: io_cqring_add_event(req, ret); req_set_fail_links(req); -- 1.8.3.1