[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 3/4] block/io: refactor bdrv_co_do_pwrite_zeroes head calculat
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v3 3/4] block/io: refactor bdrv_co_do_pwrite_zeroes head calculation |
Date: |
Wed, 10 Jun 2020 21:23:04 +0300 |
It's wrong to update head using num in this place, as num may be
reduced during the iteration (seems it doesn't, but it's not obvious),
and we'll have wrong head value on next iteration.
Instead update head at iteration end.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
block/io.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/block/io.c b/block/io.c
index 0af62a53fd..3fae97da2d 100644
--- a/block/io.c
+++ b/block/io.c
@@ -1813,7 +1813,6 @@ static int coroutine_fn
bdrv_co_do_pwrite_zeroes(BlockDriverState *bs,
* convenience, limit this request to max_transfer even if
* we don't need to fall back to writes. */
num = MIN(MIN(bytes, max_transfer), alignment - head);
- head = (head + num) % alignment;
assert(num < max_write_zeroes);
} else if (tail && num > alignment) {
/* Shorten the request to the last aligned sector. */
@@ -1872,6 +1871,9 @@ static int coroutine_fn
bdrv_co_do_pwrite_zeroes(BlockDriverState *bs,
offset += num;
bytes -= num;
+ if (head) {
+ head = offset % alignment;
+ }
}
fail:
--
2.21.0