| From c8b5e2600a2cfa1cdfbecf151afd67aee227381d Mon Sep 17 00:00:00 2001 |
| From: Jens Axboe <axboe@kernel.dk> |
| Date: Sun, 25 Oct 2020 13:53:26 -0600 |
| Subject: io_uring: use type appropriate io_kiocb handler for double poll |
| |
| From: Jens Axboe <axboe@kernel.dk> |
| |
| commit c8b5e2600a2cfa1cdfbecf151afd67aee227381d upstream. |
| |
| io_poll_double_wake() is called for both request types - both pure poll |
| requests, and internal polls. This means that we should be using the |
| right handler based on the request type. Use the one that the original |
| caller already assigned for the waitqueue handling, that will always |
| match the correct type. |
| |
| Cc: stable@vger.kernel.org # v5.8+ |
| Reported-by: Pavel Begunkov <asml.silence@gmail.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/io_uring.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/fs/io_uring.c |
| +++ b/fs/io_uring.c |
| @@ -4786,8 +4786,10 @@ static int io_poll_double_wake(struct wa |
| /* make sure double remove sees this as being gone */ |
| wait->private = NULL; |
| spin_unlock(&poll->head->lock); |
| - if (!done) |
| - __io_async_wake(req, poll, mask, io_poll_task_func); |
| + if (!done) { |
| + /* use wait func handler, so it matches the rq type */ |
| + poll->wait.func(&poll->wait, mode, sync, key); |
| + } |
| } |
| refcount_dec(&req->refs); |
| return 1; |