32ee41155b
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com> bump build-dependency on libproxmox-backup-qemu0-dev with version query support Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
86 lines
2.7 KiB
Diff
86 lines
2.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Stefan Reiter <s.reiter@proxmox.com>
|
|
Date: Thu, 13 Aug 2020 13:50:27 +0200
|
|
Subject: [PATCH] PVE: add zero block handling to PBS dump callback
|
|
|
|
Both the PBS and VMA dump callbacks assume that a NULL pointer can be
|
|
passed as *pbuf, but that never happens, as backup-dump.c calls this
|
|
function with contents of an iovec.
|
|
|
|
So first, remove that assumption and add an 'assert' to verify.
|
|
|
|
Secondly, while the vma-writer already does the buffer_is_zero check
|
|
internally, for PBS we relied on that non-existant behaviour for zero
|
|
chunks, so do the buffer_is_zero check manually and pass NULL to the
|
|
rust lib in case it is true.
|
|
|
|
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
|
---
|
|
pve-backup.c | 14 +++++++++-----
|
|
1 file changed, 9 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/pve-backup.c b/pve-backup.c
|
|
index f14273645a..bd802c6205 100644
|
|
--- a/pve-backup.c
|
|
+++ b/pve-backup.c
|
|
@@ -8,6 +8,7 @@
|
|
#include "block/blockjob.h"
|
|
#include "qapi/qapi-commands-block.h"
|
|
#include "qapi/qmp/qerror.h"
|
|
+#include "qemu/cutils.h"
|
|
|
|
/* PVE backup state and related function */
|
|
|
|
@@ -136,10 +137,13 @@ pvebackup_co_dump_pbs_cb(
|
|
PVEBackupDevInfo *di = opaque;
|
|
|
|
assert(backup_state.pbs);
|
|
+ assert(buf);
|
|
|
|
Error *local_err = NULL;
|
|
int pbs_res = -1;
|
|
|
|
+ bool is_zero_block = size == di->block_size && buffer_is_zero(buf, size);
|
|
+
|
|
qemu_co_mutex_lock(&backup_state.dump_callback_mutex);
|
|
|
|
// avoid deadlock if job is cancelled
|
|
@@ -155,7 +159,8 @@ pvebackup_co_dump_pbs_cb(
|
|
uint64_t to_transfer = left < di->block_size ? left : di->block_size;
|
|
|
|
pbs_res = proxmox_backup_co_write_data(backup_state.pbs, di->dev_id,
|
|
- buf ? buf + transferred : NULL, start + transferred, to_transfer, &local_err);
|
|
+ is_zero_block ? NULL : buf + transferred, start + transferred,
|
|
+ to_transfer, &local_err);
|
|
transferred += to_transfer;
|
|
|
|
if (pbs_res < 0) {
|
|
@@ -168,7 +173,7 @@ pvebackup_co_dump_pbs_cb(
|
|
}
|
|
|
|
qemu_co_mutex_unlock(&backup_state.dump_callback_mutex);
|
|
- pvebackup_add_transfered_bytes(size, !buf ? size : 0, reused);
|
|
+ pvebackup_add_transfered_bytes(size, is_zero_block ? size : 0, reused);
|
|
|
|
return size;
|
|
}
|
|
@@ -190,6 +195,7 @@ pvebackup_co_dump_vma_cb(
|
|
int ret = -1;
|
|
|
|
assert(backup_state.vmaw);
|
|
+ assert(buf);
|
|
|
|
uint64_t remaining = size;
|
|
|
|
@@ -216,9 +222,7 @@ pvebackup_co_dump_vma_cb(
|
|
qemu_co_mutex_unlock(&backup_state.dump_callback_mutex);
|
|
|
|
++cluster_num;
|
|
- if (buf) {
|
|
- buf += VMA_CLUSTER_SIZE;
|
|
- }
|
|
+ buf += VMA_CLUSTER_SIZE;
|
|
if (ret < 0) {
|
|
Error *local_err = NULL;
|
|
vma_writer_error_propagate(backup_state.vmaw, &local_err);
|