[pve-devel] [HACK qemu 06/13] block/{copy-before-write, snapshot-access}: implement bdrv_co_get_info driver callback

Fiona Ebner f.ebner at proxmox.com
Thu Jan 25 15:41:42 CET 2024


In preparation to fix an issue for backup fleecing where discarding
the source would lead to an assertion failure when the fleecing image
has larger granularity than the backup target.

Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---

Still need to wait on a response from upstream. For now this hack, so
that the RFC as a whole doesn't have to wait.

 block/copy-before-write.c | 30 ++++++++++++++++++++++++++++++
 block/snapshot-access.c   |  7 +++++++
 2 files changed, 37 insertions(+)

diff --git a/block/copy-before-write.c b/block/copy-before-write.c
index 87f047ad5f..961e7439ad 100644
--- a/block/copy-before-write.c
+++ b/block/copy-before-write.c
@@ -322,6 +322,35 @@ cbw_co_snapshot_block_status(BlockDriverState *bs,
     return ret;
 }
 
+static int coroutine_fn
+cbw_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+    BDRVCopyBeforeWriteState *s = bs->opaque;
+
+    BlockDriverInfo local_bdi;
+    int64_t cluster_size = 0;
+
+    int ret, ret2;
+
+    ret = bdrv_co_get_info(bs->file->bs, &local_bdi);
+    if (ret == 0) {
+        cluster_size = MAX(cluster_size, local_bdi.cluster_size);
+    }
+
+    ret2 = bdrv_co_get_info(s->target->bs, &local_bdi);
+    if (ret2 == 0) {
+        cluster_size = MAX(cluster_size, local_bdi.cluster_size);
+    }
+
+    if (ret != 0 && ret2 != 0) {
+        return ret;
+    }
+
+    bdi->cluster_size = cluster_size;
+
+    return 0;
+}
+
 static int coroutine_fn GRAPH_RDLOCK
 cbw_co_pdiscard_snapshot(BlockDriverState *bs, int64_t offset, int64_t bytes)
 {
@@ -531,6 +560,7 @@ BlockDriver bdrv_cbw_filter = {
     .bdrv_co_preadv_snapshot       = cbw_co_preadv_snapshot,
     .bdrv_co_pdiscard_snapshot     = cbw_co_pdiscard_snapshot,
     .bdrv_co_snapshot_block_status = cbw_co_snapshot_block_status,
+    .bdrv_co_get_info              = cbw_co_get_info,
 
     .bdrv_refresh_filename      = cbw_refresh_filename,
 
diff --git a/block/snapshot-access.c b/block/snapshot-access.c
index 67ea339da9..5aa20aaa1f 100644
--- a/block/snapshot-access.c
+++ b/block/snapshot-access.c
@@ -25,6 +25,7 @@
 #include "sysemu/block-backend.h"
 #include "qemu/cutils.h"
 #include "block/block_int.h"
+#include "block/copy-before-write.h"
 
 static int coroutine_fn GRAPH_RDLOCK
 snapshot_access_co_preadv_part(BlockDriverState *bs,
@@ -72,6 +73,11 @@ snapshot_access_co_pwritev_part(BlockDriverState *bs,
     return -ENOTSUP;
 }
 
+static int coroutine_fn
+snapshot_access_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+    return bdrv_co_get_info(bs->file->bs, bdi);
+}
 
 static void snapshot_access_refresh_filename(BlockDriverState *bs)
 {
@@ -118,6 +124,7 @@ BlockDriver bdrv_snapshot_access_drv = {
     .bdrv_co_pwrite_zeroes      = snapshot_access_co_pwrite_zeroes,
     .bdrv_co_pdiscard           = snapshot_access_co_pdiscard,
     .bdrv_co_block_status       = snapshot_access_co_block_status,
+    .bdrv_co_get_info           = snapshot_access_co_get_info,
 
     .bdrv_refresh_filename      = snapshot_access_refresh_filename,
 
-- 
2.39.2





More information about the pve-devel mailing list