diff options
author | Jens Axboe <axboe@kernel.dk> | 2020-09-14 17:28:14 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-09-21 15:50:54 +0200 |
commit | 8f3d749685e48c44dbe877ac9781079d85f914c8 (patch) | |
tree | 2ab90bce49b10dd87a6e3b509ea6b48c5381b005 /fs/io_uring.c | |
parent | io_uring: don't run task work on an exiting task (diff) | |
download | linux-8f3d749685e48c44dbe877ac9781079d85f914c8.tar.xz linux-8f3d749685e48c44dbe877ac9781079d85f914c8.zip |
io_uring: don't re-setup vecs/iter in io_resumit_prep() is already there
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.
Fixes: b63534c41e20 ("io_uring: re-issue block requests that failed because of resources")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to '')
-rw-r--r-- | fs/io_uring.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index a29c8913b1f0..b93355ccceeb 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2294,13 +2294,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, iovec, inline_vecs, &iter, false); - 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, iovec, inline_vecs, &iter, false); + if (!ret) + return true; + kfree(iovec); + } else { return true; - kfree(iovec); + } end_req: req_set_fail_links(req); io_req_complete(req, ret); |