For fleecing, the size needs to match exactly with what QEMU sees. In
particular, EFI disks might be attached with a 'size=' option, meaning
that size can be different from the volume's size. Commit 36377acf
("backup: disk info: also keep track of size") introduced size
tracking and it was only used for fleecing since then, so replace the
existing 'size' key in the device info hash and replace it with an
explicit 'block-node-size' for clarity.

Should also help with the following issue reported in the community
forum:
https://forum.proxmox.com/threads/152202

Fixes: 36377acf ("backup: disk info: also keep track of size")
Signed-off-by: Fiona Ebner <f.eb...@proxmox.com>
---

New in v2.

 PVE/VZDump/QemuServer.pm | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
index c46e607c..98685127 100644
--- a/PVE/VZDump/QemuServer.pm
+++ b/PVE/VZDump/QemuServer.pm
@@ -106,6 +106,9 @@ sub prepare {
 
     PVE::Storage::activate_volumes($self->{storecfg}, $vollist);
 
+    my $block_info = mon_cmd($vmid, "query-block");
+    $block_info = { map { $_->{device} => $_ } $block_info->@* };
+
     foreach my $ds (sort keys %$drivehash) {
        my $drive = $drivehash->{$ds};
 
@@ -133,11 +136,22 @@ sub prepare {
            die "cannot determine size and format of volume '$volid' - $@\n" if 
$@;
        }
 
+       # The size for fleecing images needs to be exactly the same size as 
QEMU sees. E.g. EFI disk
+       # can be attached with a smaller size then the underyling image on the 
storage.
+       my $block_node_size =
+           eval { 
$block_info->{"drive-$ds"}->{inserted}->{image}->{'virtual-size'}; };
+       if (!$block_node_size) {
+           # TPM state is not attached yet and will be attached with same 
size, so don't warn then.
+           $self->loginfo("could not determine block node size of drive '$ds' 
- using fallback")
+               if $ds !~ m/^tpmstate\d+/;
+           $block_node_size = $size;
+       }
+
        my $diskinfo = {
            path => $path,
            volid => $volid,
            storeid => $storeid,
-           size => $size,
+           'block-node-size' => $block_node_size,
            format => $format,
            virtdev => $ds,
            qmdevice => "drive-$ds",
@@ -551,7 +565,7 @@ my sub allocate_fleecing_images {
                my $name = "vm-$vmid-fleece-$n";
                $name .= ".$format" if $scfg->{path};
 
-               my $size = PVE::Tools::convert_size($di->{size}, 'b' => 'kb');
+               my $size = PVE::Tools::convert_size($di->{'block-node-size'}, 
'b' => 'kb');
 
                $di->{'fleece-volid'} = PVE::Storage::vdisk_alloc(
                    $self->{storecfg}, $fleecing_storeid, $vmid, $format, 
$name, $size);
@@ -600,7 +614,7 @@ my sub attach_fleecing_images {
            my $drive = 
"file=$path,if=none,id=$devid,format=$format,discard=unmap";
            # Specify size explicitly, to make it work if storage backend 
rounded up size for
            # fleecing image when allocating.
-           $drive .= ",size=$di->{size}" if $format eq 'raw';
+           $drive .= ",size=$di->{'block-node-size'}" if $format eq 'raw';
            $drive =~ s/\\/\\\\/g;
            my $ret = PVE::QemuServer::Monitor::hmp_cmd($vmid, "drive_add auto 
\"$drive\"", 60);
            die "attaching fleecing image $volid failed - $ret\n" if $ret !~ 
m/OK/s;
-- 
2.39.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to