vma/alloc-track improvements
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>master
parent
4fd0fa7fb3
commit
39e84ba82d
57
debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch
vendored
Normal file
57
debian/patches/pve/0057-vma-create-support-64KiB-unaligned-input-images.patch
vendored
Normal file
|
@ -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;
|
25
debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch
vendored
Normal file
25
debian/patches/pve/0058-vma-create-avoid-triggering-assertion-in-error-case.patch
vendored
Normal file
|
@ -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;
|
|
@ -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) {
|
|
@ -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/0054-PVE-Backup-create-jobs-correctly-cancel-in-error-sce.patch
|
||||||
pve/0055-PVE-Backup-ensure-jobs-in-di_list-are-referenced.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/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
|
||||||
|
|
Loading…
Reference in New Issue