From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Stefan Reiter 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 --- 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);