]> git.proxmox.com Git - pve-qemu.git/commitdiff
vma/alloc-track improvements
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 22 Jun 2022 13:52:16 +0000 (15:52 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 22 Jun 2022 13:52:16 +0000 (15:52 +0200)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch [new file with mode: 0644]
debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch [new file with mode: 0644]
debian/patches/pve/0059-block-alloc-track-avoid-premature-break.patch [new file with mode: 0644]
debian/patches/series

diff --git a/debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch b/debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch
new file mode 100644 (file)
index 0000000..7d9a07d
--- /dev/null
@@ -0,0 +1,57 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Fabian Ebner <f.ebner@proxmox.com>
+Date: Wed, 22 Jun 2022 10:45:11 +0200
+Subject: [PATCH] vma: create: support 64KiB-unaligned input images
+
+which fixes backing up templates with such disks in PVE, for example
+efitype=4m EFI disks on a file-based storage (size = 540672).
+
+If there is not enough left to read, blk_co_preadv will return -EIO,
+so limit the size in the last iteration.
+
+For writing, an unaligned end is already handled correctly.
+
+The call to memset is not strictly necessary, because writing also
+checks that it doesn't write data beyond the end of the image. But
+there are two reasons to do it:
+1. It's cleaner that way.
+2. It allows detecting when the final piece is all zeroes, which might
+   not happen if the buffer still contains data from the previous
+   iteration.
+
+Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
+---
+ vma.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/vma.c b/vma.c
+index 21e765a469..6d02b29047 100644
+--- a/vma.c
++++ b/vma.c
+@@ -548,7 +548,7 @@ static void coroutine_fn backup_run(void *opaque)
+     struct iovec iov;
+     QEMUIOVector qiov;
+-    int64_t start, end;
++    int64_t start, end, readlen;
+     int ret = 0;
+     unsigned char *buf = blk_blockalign(job->target, VMA_CLUSTER_SIZE);
+@@ -562,8 +562,16 @@ static void coroutine_fn backup_run(void *opaque)
+         iov.iov_len = VMA_CLUSTER_SIZE;
+         qemu_iovec_init_external(&qiov, &iov, 1);
++        if (start + 1 == end) {
++            memset(buf, 0, VMA_CLUSTER_SIZE);
++            readlen = job->len - start * VMA_CLUSTER_SIZE;
++            assert(readlen > 0 && readlen <= VMA_CLUSTER_SIZE);
++        } else {
++            readlen = VMA_CLUSTER_SIZE;
++        }
++
+         ret = blk_co_preadv(job->target, start * VMA_CLUSTER_SIZE,
+-                            VMA_CLUSTER_SIZE, &qiov, 0);
++                            readlen, &qiov, 0);
+         if (ret < 0) {
+             vma_writer_set_error(job->vmaw, "read error", -1);
+             goto out;
diff --git a/debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch b/debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch
new file mode 100644 (file)
index 0000000..586f2ba
--- /dev/null
@@ -0,0 +1,25 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Fabian Ebner <f.ebner@proxmox.com>
+Date: Wed, 22 Jun 2022 10:45:12 +0200
+Subject: [PATCH] vma: create: avoid triggering assertion in error case
+
+error_setg expects its argument to not be initialized yet.
+
+Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
+---
+ vma-writer.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/vma-writer.c b/vma-writer.c
+index 11d8321ffd..29567cba68 100644
+--- a/vma-writer.c
++++ b/vma-writer.c
+@@ -310,6 +310,8 @@ VmaWriter *vma_writer_create(const char *filename, uuid_t uuid, Error **errp)
+         }
+         if (vmaw->fd < 0) {
++            error_free(*errp);
++            *errp = NULL;
+             error_setg(errp, "can't open file %s - %s\n", filename,
+                        g_strerror(errno));
+             goto err;
diff --git a/debian/patches/pve/0059-block-alloc-track-avoid-premature-break.patch b/debian/patches/pve/0059-block-alloc-track-avoid-premature-break.patch
new file mode 100644 (file)
index 0000000..a3c4909
--- /dev/null
@@ -0,0 +1,36 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Fabian Ebner <f.ebner@proxmox.com>
+Date: Wed, 22 Jun 2022 10:45:13 +0200
+Subject: [PATCH] block: alloc-track: avoid premature break
+
+While the bdrv_co_preadv() calls are expected to return 0 on success,
+qemu_iovec_memset() will return the number of bytes set (will be
+local_bytes, because the slice with that size was just initialized).
+
+Don't break out of the loop after the branch with qemu_iovec_memset(),
+because there might still be work to do. Additionally, ret is an int,
+which on 64-bit platforms is too small to hold the size_t returned by
+qemu_iovec_memset().
+
+The branch seems to be difficult to reach in practice, because the
+whole point of alloc-track is to be used with a backing device.
+
+Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
+---
+ block/alloc-track.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/block/alloc-track.c b/block/alloc-track.c
+index 6b50fbe537..c1160af04b 100644
+--- a/block/alloc-track.c
++++ b/block/alloc-track.c
+@@ -174,7 +174,8 @@ static int coroutine_fn track_co_preadv(BlockDriverState *bs,
+             ret = bdrv_co_preadv(bs->backing, local_offset, local_bytes,
+                                  &local_qiov, flags);
+         } else {
+-            ret = qemu_iovec_memset(&local_qiov, cur_offset, 0, local_bytes);
++            qemu_iovec_memset(&local_qiov, cur_offset, 0, local_bytes);
++            ret = 0;
+         }
+         if (ret != 0) {
index 394ae55943b519498e022d253ce1ac49efec6a12..dc51355df77073a0658d95608580174f4e6798ef 100644 (file)
@@ -79,3 +79,6 @@ pve/0053-Revert-block-rbd-implement-bdrv_co_block_status.patch
 pve/0054-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch
 pve/0055-PVE-Backup-ensure-jobs-in-di_list-are-referenced.patch
 pve/0056-PVE-Backup-avoid-segfault-issues-upon-backup-cancel.patch
+pve/0057-vma-create-support-64KiB-unaligned-input-images.patch
+pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch
+pve/0059-block-alloc-track-avoid-premature-break.patch