From 2821f02d70c4c2d0826cd3cdefbf255c044e58bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Tue, 11 Aug 2020 11:14:36 +0200 Subject: [PATCH] fix PBS write callback with big blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Grünbichler --- ...e-callback-with-big-blocks-correctly.patch | 86 +++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 87 insertions(+) create mode 100644 debian/patches/pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch diff --git a/debian/patches/pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch b/debian/patches/pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch new file mode 100644 index 0000000..76f7acf --- /dev/null +++ b/debian/patches/pve/0047-pbs-handle-write-callback-with-big-blocks-correctly.patch @@ -0,0 +1,86 @@ +From: Stefan Reiter +Subject: PVE: handle PBS write callback with big blocks correctly + +Under certain conditions QEMU will push more than the given blocksize +into the callback at once. Handle it like VMA does, by iterating the +data until all is written. + +The block size is stored per backup device to be used in the callback. +This avoids relying on PROXMOX_BACKUP_DEFAULT_CHUNK_SIZE, in case it is +made configurable in the future. + +Signed-off-by: Stefan Reiter +--- + + pve-backup.c | 30 ++++++++++++++++++++++-------- + 1 file changed, 22 insertions(+), 8 deletions(-) + +diff --git a/pve-backup.c b/pve-backup.c +index 77eb475563..40d8136f1a 100644 +--- a/pve-backup.c ++++ b/pve-backup.c +@@ -67,6 +67,7 @@ opts_init(pvebackup_init); + typedef struct PVEBackupDevInfo { + BlockDriverState *bs; + size_t size; ++ uint64_t block_size; + uint8_t dev_id; + bool completed; + char targetfile[PATH_MAX]; +@@ -147,17 +148,28 @@ pvebackup_co_dump_pbs_cb( + return -1; + } + +- pbs_res = proxmox_backup_co_write_data(backup_state.pbs, di->dev_id, buf, start, size, &local_err); +- qemu_co_mutex_unlock(&backup_state.dump_callback_mutex); ++ uint64_t transferred = 0; ++ uint64_t reused = 0; ++ while (transferred < size) { ++ uint64_t left = size - transferred; ++ uint64_t to_transfer = left < di->block_size ? left : di->block_size; + +- if (pbs_res < 0) { +- pvebackup_propagate_error(local_err); +- return pbs_res; +- } else { +- size_t reused = (pbs_res == 0) ? size : 0; +- pvebackup_add_transfered_bytes(size, !buf ? size : 0, reused); ++ pbs_res = proxmox_backup_co_write_data(backup_state.pbs, di->dev_id, ++ buf ? buf + transferred : NULL, start + transferred, to_transfer, &local_err); ++ transferred += to_transfer; ++ ++ if (pbs_res < 0) { ++ pvebackup_propagate_error(local_err); ++ qemu_co_mutex_unlock(&backup_state.dump_callback_mutex); ++ return pbs_res; ++ } ++ ++ reused += pbs_res == 0 ? to_transfer : 0; + } + ++ qemu_co_mutex_unlock(&backup_state.dump_callback_mutex); ++ pvebackup_add_transfered_bytes(size, !buf ? size : 0, reused); ++ + return size; + } + +@@ -730,6 +742,8 @@ static void coroutine_fn pvebackup_co_prepare(void *opaque) + PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data; + l = g_list_next(l); + ++ di->block_size = dump_cb_block_size; ++ + const char *devname = bdrv_get_device_name(di->bs); + + BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(di->bs, PBS_BITMAP_NAME); +-- +2.20.1 + + + +_______________________________________________ +pbs-devel mailing list +pbs-devel@lists.proxmox.com +https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel + + diff --git a/debian/patches/series b/debian/patches/series index 531c5b9..417477a 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -46,3 +46,4 @@ pve/0043-PVE-fixup-pbs-backup-add-compress-and-encrypt-option.patch 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