[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 02/25] block/rbd: fix write zeroes with growing images
From: |
Hanna Reitz |
Subject: |
[PULL 02/25] block/rbd: fix write zeroes with growing images |
Date: |
Tue, 22 Mar 2022 12:56:24 +0100 |
From: Stefano Garzarella <sgarzare@redhat.com>
Commit d24f80234b ("block/rbd: increase dynamically the image size")
added a workaround to support growing images (eg. qcow2), resizing
the image before write operations that exceed the current size.
We recently added support for write zeroes and without the
workaround we can have problems with qcow2.
So let's move the resize into qemu_rbd_start_co() and do it when
the command is RBD_AIO_WRITE or RBD_AIO_WRITE_ZEROES.
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2020993
Fixes: c56ac27d2a ("block/rbd: add write zeroes support")
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Message-Id: <20220317162638.41192-1-sgarzare@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
---
block/rbd.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index 8f183eba2a..6caf35cbba 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -1107,6 +1107,20 @@ static int coroutine_fn
qemu_rbd_start_co(BlockDriverState *bs,
assert(!qiov || qiov->size == bytes);
+ if (cmd == RBD_AIO_WRITE || cmd == RBD_AIO_WRITE_ZEROES) {
+ /*
+ * RBD APIs don't allow us to write more than actual size, so in order
+ * to support growing images, we resize the image before write
+ * operations that exceed the current size.
+ */
+ if (offset + bytes > s->image_size) {
+ int r = qemu_rbd_resize(bs, offset + bytes);
+ if (r < 0) {
+ return r;
+ }
+ }
+ }
+
r = rbd_aio_create_completion(&task,
(rbd_callback_t) qemu_rbd_completion_cb, &c);
if (r < 0) {
@@ -1182,18 +1196,6 @@ coroutine_fn qemu_rbd_co_pwritev(BlockDriverState *bs,
int64_t offset,
int64_t bytes, QEMUIOVector *qiov,
BdrvRequestFlags flags)
{
- BDRVRBDState *s = bs->opaque;
- /*
- * RBD APIs don't allow us to write more than actual size, so in order
- * to support growing images, we resize the image before write
- * operations that exceed the current size.
- */
- if (offset + bytes > s->image_size) {
- int r = qemu_rbd_resize(bs, offset + bytes);
- if (r < 0) {
- return r;
- }
- }
return qemu_rbd_start_co(bs, offset, bytes, qiov, flags, RBD_AIO_WRITE);
}
--
2.35.1
- [PULL 00/25] Block patches for 7.0-rc1, Hanna Reitz, 2022/03/22
- [PULL 02/25] block/rbd: fix write zeroes with growing images,
Hanna Reitz <=
- [PULL 03/25] tests/qemu-iotests: Use GNU sed in two more spots where it is necessary, Hanna Reitz, 2022/03/22
- [PULL 01/25] tests: add (riscv virt) machine mapping to testenv, Hanna Reitz, 2022/03/22
- [PULL 05/25] tests/qemu-iotests/testrunner: Supply a test plan in TAP mode, Hanna Reitz, 2022/03/22
- [PULL 04/25] tests: Do not treat the iotests as separate meson test target anymore, Hanna Reitz, 2022/03/22
- [PULL 08/25] iotests: Remove explicit checks for qemu_img() == 0, Hanna Reitz, 2022/03/22
- [PULL 06/25] python/utils: add add_visual_margin() text decoration utility, Hanna Reitz, 2022/03/22
- [PULL 07/25] python/utils: add VerboseProcessError, Hanna Reitz, 2022/03/22
- [PULL 10/25] iotests: fortify compare_images() against crashes, Hanna Reitz, 2022/03/22
- [PULL 09/25] iotests: make qemu_img raise on non-zero rc by default, Hanna Reitz, 2022/03/22
- [PULL 13/25] iotests: add qemu_img_info(), Hanna Reitz, 2022/03/22