io_uring: clear req->result on IOPOLL re-issue
authorJens Axboe <axboe@kernel.dk>
Thu, 27 Aug 2020 00:58:26 +0000 (18:58 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 27 Aug 2020 00:58:26 +0000 (18:58 -0600)
Make sure we clear req->result, which was set to -EAGAIN for retry
purposes, when moving it to the reissue list. Otherwise we can end up
retrying a request more than once, which leads to weird results in
the io-wq handling (and other spots).

Cc: stable@vger.kernel.org
Reported-by: Andres Freund <andres@anarazel.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index bd2d8de..6df0828 100644 (file)
@@ -2049,6 +2049,7 @@ static void io_iopoll_complete(struct io_ring_ctx *ctx, unsigned int *nr_events,
 
                req = list_first_entry(done, struct io_kiocb, inflight_entry);
                if (READ_ONCE(req->result) == -EAGAIN) {
+                       req->result = 0;
                        req->iopoll_completed = 0;
                        list_move_tail(&req->inflight_entry, &again);
                        continue;