From c5f7dc1d7281fb5ef077269b45a0b290b8300509 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Wed, 19 Aug 2020 13:56:03 +0200 Subject: [PATCH] PVE: add zero block handling to PBS dump callback Signed-off-by: Thomas Lamprecht --- ...-block-handling-to-PBS-dump-callback.patch | 85 +++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 86 insertions(+) create mode 100644 debian/patches/pve/0048-PVE-add-zero-block-handling-to-PBS-dump-callback.patch diff --git a/debian/patches/pve/0048-PVE-add-zero-block-handling-to-PBS-dump-callback.patch b/debian/patches/pve/0048-PVE-add-zero-block-handling-to-PBS-dump-callback.patch new file mode 100644 index 0000000..d1661d4 --- /dev/null +++ b/debian/patches/pve/0048-PVE-add-zero-block-handling-to-PBS-dump-callback.patch @@ -0,0 +1,85 @@ +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 40d8136f1a..7c99554514 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); diff --git a/debian/patches/series b/debian/patches/series index 417477a..38793fd 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -47,3 +47,4 @@ pve/0044-PVE-Add-PBS-block-driver-to-map-backup-archives-into.patch pve/0045-PVE-add-query_proxmox_support-QMP-command.patch pve/0046-pbs-fix-missing-crypt-and-compress-parameters.patch pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch +pve/0048-PVE-add-zero-block-handling-to-PBS-dump-callback.patch -- 2.39.2