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 | 3612 | ret = nr; |
| 3613 | 3613 | break; |
| 3614 | 3614 | } |
| 3615 | + ret += nr; | |
| 3615 | 3616 | if (!iov_iter_is_bvec(iter)) { |
| 3616 | 3617 | iov_iter_advance(iter, nr); |
| 3617 | 3618 | } else { |
| 3618 | − req->rw.len -= nr; | |
| 3619 | 3619 | req->rw.addr += nr; |
| 3620 | + req->rw.len -= nr; | |
| 3621 | + if (!req->rw.len) | |
| 3622 | + break; | |
| 3620 | 3623 | } |
| 3621 | − ret += nr; | |
| 3622 | 3624 | if (nr != iovec.iov_len) |
| 3623 | 3625 | break; |
| 3624 | 3626 | } |