From 39e84ba82ddd28ca7ec98d59881c53d62406e8a9 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Wed, 22 Jun 2022 15:52:16 +0200 Subject: [PATCH] vma/alloc-track improvements Signed-off-by: Thomas Lamprecht --- ...support-64KiB-unaligned-input-images.patch | 57 +++++++++++++++++++ ...d-triggering-assertion-in-error-case.patch | 25 ++++++++ ...ck-alloc-track-avoid-premature-break.patch | 36 ++++++++++++ debian/patches/series | 3 + 4 files changed, 121 insertions(+) create mode 100644 debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch create mode 100644 debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch create mode 100644 debian/patches/pve/0059-block-alloc-track-avoid-premature-break.patch 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 index 0000000..7d9a07d --- /dev/null +++ b/debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch @@ -0,0 +1,57 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fabian Ebner +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 +--- + 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 index 0000000..586f2ba --- /dev/null +++ b/debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch @@ -0,0 +1,25 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fabian Ebner +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 +--- + 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 index 0000000..a3c4909 --- /dev/null +++ b/debian/patches/pve/0059-block-alloc-track-avoid-premature-break.patch @@ -0,0 +1,36 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fabian Ebner +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 +--- + 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) { diff --git a/debian/patches/series b/debian/patches/series index 394ae55..dc51355 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -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