History

io_uring: terminate manual loop iterator loop correctly for non-vecs

The fix for not advancing the iterator if we're using fixed buffers is broken in that it can hit a condition where we don't terminate the loop. This results in io-wq looping forever, asking to read (or write) 0 bytes for every subsequent loop.

Jens Axboe committed 4 years ago

Commit 5e929361 parent adf3a9e1 file · +4 −2Browse files

Unified · Split

fs/io_uring.c+4−2
@@ -3612,13 +3612,15 @@ static ssize_t loop_rw_iter(int rw, struct io_kiocb *req, struct iov_iter *iter) · 3611 unmodified lines
3612 ret = nr;3612 ret = nr;
3613 break;3613 break;
3614 }3614 }
3615 ret += nr;
3615 if (!iov_iter_is_bvec(iter)) {3616 if (!iov_iter_is_bvec(iter)) {
3616 iov_iter_advance(iter, nr);3617 iov_iter_advance(iter, nr);
3617 } else {3618 } else {
3618 req->rw.len -= nr;
3619 req->rw.addr += nr;3619 req->rw.addr += nr;
3620 req->rw.len -= nr;
3621 if (!req->rw.len)
3622 break;
3620 }3623 }
3621 ret += nr;
3622 if (nr != iovec.iov_len)3624 if (nr != iovec.iov_len)
3623 break;3625 break;
3624 }3626 }