[pve-devel] [PATCH qemu-server v2 07/32] drive: parse: properly handle dropped properties for restore

Fiona Ebner f.ebner at proxmox.com
Wed Jun 18 15:01:44 CEST 2025


Restoring old backups should still work when properties are dropped
from the schema. In particular, it is necessary to skip such
properties when parsing the configuration during restore.

Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---

Dependency bump for libpve-common-perl needed.

Changes in v2:
* Different approach, skip dropped keys, rather than allowing all
  additional properties.

 src/PVE/QemuServer.pm       | 4 ++--
 src/PVE/QemuServer/Drive.pm | 7 ++++++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 3960203b..cfeb8949 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -7151,7 +7151,7 @@ my $parse_backup_hints = sub {
             $virtdev_hash->{$virtdev} = $devinfo->{$devname};
         } elsif ($line =~ m/^((?:ide|sata|scsi)\d+):\s*(.*)\s*$/) {
             my $virtdev = $1;
-            my $drive = parse_drive($virtdev, $2);
+            my $drive = parse_drive($virtdev, $2, { 'for-restore' => 1 });
 
             if (drive_is_cloudinit($drive)) {
                 my ($storeid, $volname) = PVE::Storage::parse_volume_id($drive->{file});
@@ -7257,7 +7257,7 @@ sub restore_update_config_line {
     } elsif ($line =~ m/^((ide|scsi|virtio|sata|efidisk|tpmstate)\d+):\s*(\S+)\s*$/) {
         my $virtdev = $1;
         my $value = $3;
-        my $di = parse_drive($virtdev, $value);
+        my $di = parse_drive($virtdev, $value, { 'for-restore' => 1 });
         if (defined($di->{backup}) && !$di->{backup}) {
             $res .= "#$line";
         } elsif ($map->{$virtdev}) {
diff --git a/src/PVE/QemuServer/Drive.pm b/src/PVE/QemuServer/Drive.pm
index b9ceb130..0e99257b 100644
--- a/src/PVE/QemuServer/Drive.pm
+++ b/src/PVE/QemuServer/Drive.pm
@@ -26,6 +26,8 @@ our @EXPORT_OK = qw(
     print_drive
 );
 
+my $DROPPED_PROPERTIES = [];
+
 our $QEMU_FORMAT_RE = qr/raw|qcow|qcow2|qed|vmdk|cloop/;
 
 PVE::JSONSchema::register_standard_option(
@@ -791,7 +793,10 @@ sub parse_drive {
     }
 
     my $desc = $desc_hash->{$key}->{format};
-    my $res = eval { PVE::JSONSchema::parse_property_string($desc, $data) };
+    my $res = eval {
+        my $pps_opts = $parse_opts->{'for-restore'} ? { skip => $DROPPED_PROPERTIES } : {};
+        PVE::JSONSchema::parse_property_string($desc, $data, undef, undef, $pps_opts);
+    };
     return if !$res;
     $res->{interface} = $interface;
     $res->{index} = $index;
-- 
2.39.5





More information about the pve-devel mailing list