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.
Unified · Split
| @@ -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 | } |