Message ID | 20220712153256.2202024-1-kbusch@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [PATCHv2,1/3] block: ensure iov_iter advances for added pages | expand |
On 7/12/22 9:32 AM, Keith Busch wrote: > From: Keith Busch <kbusch@kernel.org> > > There are cases where a bio may not accept additional pages, and the iov > needs to advance to the last data length that was accepted. The zone > append used to handle this correctly, but was inadvertently broken when > the setup was made common with the normal r/w case. Al, how do you want to handle this? I currently see you have that block-fixes branch, but I don't see anything depending on it. I can do one of the following with these three fixes: 1) Apply them on top of for-5.20/block 2) Apply them to a new branch off the tag I made for you And that still leaves the question of what will happen with your block-fixes branch. Did you want me to pull that in? Or?
On Tue, 12 Jul 2022 08:32:54 -0700, Keith Busch wrote: > From: Keith Busch <kbusch@kernel.org> > > There are cases where a bio may not accept additional pages, and the iov > needs to advance to the last data length that was accepted. The zone > append used to handle this correctly, but was inadvertently broken when > the setup was made common with the normal r/w case. > > [...] Applied, thanks! [1/3] block: ensure iov_iter advances for added pages commit: 5a044eef1265581683530e75351c19e29ee33a11 [2/3] block: ensure bio_iov_add_page can't fail commit: ac3c48e32c047a3781d6bc28bb5013e4431350fd [3/3] block: fix leaking page ref on truncated direct io commit: 44b6b0b0e980d99d24de7e5d57baae48a78db3b6 Best regards,
diff --git a/block/bio.c b/block/bio.c index 933ea3210954..fdd58461b78f 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1211,6 +1211,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) ssize_t size, left; unsigned len, i; size_t offset; + int ret = 0; /* * Move page array up in the allocated memory for the bio vecs as far as @@ -1235,7 +1236,6 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) for (left = size, i = 0; left > 0; left -= len, i++) { struct page *page = pages[i]; - int ret; len = min_t(size_t, PAGE_SIZE - offset, left); if (bio_op(bio) == REQ_OP_ZONE_APPEND) @@ -1246,13 +1246,13 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) if (ret) { bio_put_pages(pages + i, left, offset); - return ret; + break; } offset = 0; } - iov_iter_advance(iter, size); - return 0; + iov_iter_advance(iter, size - left); + return ret; } /**