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.eb...@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



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to