all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH qemu] PVE: handle PBS write callback with big blocks correctly
@ 2020-07-14 13:17 Stefan Reiter
  2020-07-15  6:51 ` Fabian Grünbichler
  0 siblings, 1 reply; 2+ messages in thread
From: Stefan Reiter @ 2020-07-14 13:17 UTC (permalink / raw)
  To: pbs-devel

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 in PROXMOX_BACKUP_DEFAULT_CHUNK_SIZE (or smaller, for last one)
sized blocks.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---

As briefly tested by Fabian, it seems to fix the original issue.

 pve-backup.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/pve-backup.c b/pve-backup.c
index 77eb475563..4d423611e1 100644
--- a/pve-backup.c
+++ b/pve-backup.c
@@ -147,17 +147,29 @@ 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 < PROXMOX_BACKUP_DEFAULT_CHUNK_SIZE ?
+            left : PROXMOX_BACKUP_DEFAULT_CHUNK_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;
 }
 
-- 
2.20.1





^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-07-15  6:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-14 13:17 [pbs-devel] [PATCH qemu] PVE: handle PBS write callback with big blocks correctly Stefan Reiter
2020-07-15  6:51 ` Fabian Grünbichler

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal