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