52 lines
2.3 KiB
Diff
52 lines
2.3 KiB
Diff
|
|
From bad8a640a29f16b4d333673577b06880894766e1 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||
|
|
Date: Fri, 20 Sep 2019 17:20:42 +0300
|
||
|
|
Subject: [PATCH] block/backup: fix max_transfer handling for copy_range
|
||
|
|
|
||
|
|
Of course, QEMU_ALIGN_UP is a typo, it should be QEMU_ALIGN_DOWN, as we
|
||
|
|
are trying to find aligned size which satisfy both source and target.
|
||
|
|
Also, don't ignore too small max_transfer. In this case seems safer to
|
||
|
|
disable copy_range.
|
||
|
|
|
||
|
|
Fixes: 9ded4a0114968e
|
||
|
|
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||
|
|
Message-id: 20190920142056.12778-2-vsementsov@virtuozzo.com
|
||
|
|
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
||
|
|
(cherry picked from commit 981fb5810aa3f68797ee6e261db338bd78857614)
|
||
|
|
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
|
||
|
|
---
|
||
|
|
block/backup.c | 15 +++++++++++----
|
||
|
|
1 file changed, 11 insertions(+), 4 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/block/backup.c b/block/backup.c
|
||
|
|
index 381659d..8119d3c 100644
|
||
|
|
--- a/block/backup.c
|
||
|
|
+++ b/block/backup.c
|
||
|
|
@@ -666,12 +666,19 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||
|
|
job->cluster_size = cluster_size;
|
||
|
|
job->copy_bitmap = copy_bitmap;
|
||
|
|
copy_bitmap = NULL;
|
||
|
|
- job->use_copy_range = !compress; /* compression isn't supported for it */
|
||
|
|
job->copy_range_size = MIN_NON_ZERO(blk_get_max_transfer(job->common.blk),
|
||
|
|
blk_get_max_transfer(job->target));
|
||
|
|
- job->copy_range_size = MAX(job->cluster_size,
|
||
|
|
- QEMU_ALIGN_UP(job->copy_range_size,
|
||
|
|
- job->cluster_size));
|
||
|
|
+ job->copy_range_size = QEMU_ALIGN_DOWN(job->copy_range_size,
|
||
|
|
+ job->cluster_size);
|
||
|
|
+ /*
|
||
|
|
+ * Set use_copy_range, consider the following:
|
||
|
|
+ * 1. Compression is not supported for copy_range.
|
||
|
|
+ * 2. copy_range does not respect max_transfer (it's a TODO), so we factor
|
||
|
|
+ * that in here. If max_transfer is smaller than the job->cluster_size,
|
||
|
|
+ * we do not use copy_range (in that case it's zero after aligning down
|
||
|
|
+ * above).
|
||
|
|
+ */
|
||
|
|
+ job->use_copy_range = !compress && job->copy_range_size > 0;
|
||
|
|
|
||
|
|
/* Required permissions are already taken with target's blk_new() */
|
||
|
|
block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
|
||
|
|
--
|
||
|
|
1.8.3.1
|
||
|
|
|