[pve-devel] [PATCH qemu-server 04/12] drive: move vm_is_volid_owner() and try_deallocate_drive() helpers to Drive module

Fiona Ebner f.ebner at proxmox.com
Tue Mar 4 11:44:05 CET 2025


While at it, avoid making the if conditions/lines for the
try_deallocate_drive() callers even longer, and bring the code in-line
with the style guide.

No functional change intended.

Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---
 PVE/API2/Qemu.pm        |  8 ++++++--
 PVE/QemuServer.pm       | 42 +++--------------------------------------
 PVE/QemuServer/Drive.pm | 38 +++++++++++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+), 41 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 5ac61aa5..fc0df860 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -1972,13 +1972,17 @@ my $update_vm_api  = sub {
 		    my $drive = PVE::QemuServer::parse_drive($opt, $val);
 		    PVE::QemuConfig->check_protection($conf, "can't remove unused disk '$drive->{file}'");
 		    $rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.Disk']);
-		    if (PVE::QemuServer::try_deallocate_drive($storecfg, $vmid, $conf, $opt, $drive, $rpcenv, $authuser)) {
+		    my $remove_from_config = PVE::QemuServer::Drive::try_deallocate_drive(
+			$storecfg, $vmid, $conf, $opt, $drive, $rpcenv, $authuser);
+		    if ($remove_from_config) {
 			delete $conf->{$opt};
 			PVE::QemuConfig->write_config($vmid, $conf);
 		    }
 		} elsif ($opt eq 'vmstate') {
 		    PVE::QemuConfig->check_protection($conf, "can't remove vmstate '$val'");
-		    if (PVE::QemuServer::try_deallocate_drive($storecfg, $vmid, $conf, $opt, { file => $val }, $rpcenv, $authuser, 1)) {
+		    my $remove_from_config = PVE::QemuServer::Drive::try_deallocate_drive(
+			$storecfg, $vmid, $conf, $opt, { file => $val }, $rpcenv, $authuser, 1);
+		    if ($remove_from_config) {
 			delete $conf->{$opt};
 			PVE::QemuConfig->write_config($vmid, $conf);
 		    }
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 9d06ac8b..454ee64a 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -1830,20 +1830,6 @@ sub add_random_macs {
     }
 }
 
-sub vm_is_volid_owner {
-    my ($storecfg, $vmid, $volid) = @_;
-
-    if ($volid !~  m|^/|) {
-	my ($path, $owner);
-	eval { ($path, $owner) = PVE::Storage::path($storecfg, $volid); };
-	if ($owner && ($owner == $vmid)) {
-	    return 1;
-	}
-    }
-
-    return;
-}
-
 sub vmconfig_register_unused_drive {
     my ($storecfg, $vmid, $conf, $drive) = @_;
 
@@ -1853,7 +1839,7 @@ sub vmconfig_register_unused_drive {
 	delete $conf->{cloudinit};
     } elsif (!drive_is_cdrom($drive)) {
 	my $volid = $drive->{file};
-	if (vm_is_volid_owner($storecfg, $vmid, $volid)) {
+	if (PVE::QemuServer::Drive::vm_is_volid_owner($storecfg, $vmid, $volid)) {
 	    PVE::QemuConfig->add_unused_volume($conf, $volid, $vmid);
 	}
     }
@@ -5027,29 +5013,6 @@ sub vmconfig_hotplug_pending {
     }
 }
 
-sub try_deallocate_drive {
-    my ($storecfg, $vmid, $conf, $key, $drive, $rpcenv, $authuser, $force) = @_;
-
-    if (($force || $key =~ /^unused/) && !drive_is_cdrom($drive, 1)) {
-	my $volid = $drive->{file};
-	if (vm_is_volid_owner($storecfg, $vmid, $volid)) {
-	    my $sid = PVE::Storage::parse_volume_id($volid);
-	    $rpcenv->check($authuser, "/storage/$sid", ['Datastore.AllocateSpace']);
-
-	    # check if the disk is really unused
-	    die "unable to delete '$volid' - volume is still in use (snapshot?)\n"
-		if PVE::QemuServer::Drive::is_volume_in_use($storecfg, $conf, $key, $volid);
-	    PVE::Storage::vdisk_free($storecfg, $volid);
-	    return 1;
-	} else {
-	    # If vm is not owner of this disk remove from config
-	    return 1;
-	}
-    }
-
-    return;
-}
-
 sub vmconfig_delete_or_detach_drive {
     my ($vmid, $storecfg, $conf, $opt, $force) = @_;
 
@@ -5060,7 +5023,8 @@ sub vmconfig_delete_or_detach_drive {
 
     if ($force) {
 	$rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.Disk']);
-	try_deallocate_drive($storecfg, $vmid, $conf, $opt, $drive, $rpcenv, $authuser, $force);
+	PVE::QemuServer::Drive::try_deallocate_drive(
+	    $storecfg, $vmid, $conf, $opt, $drive, $rpcenv, $authuser, $force);
     } else {
 	vmconfig_register_unused_drive($storecfg, $vmid, $conf, $drive);
     }
diff --git a/PVE/QemuServer/Drive.pm b/PVE/QemuServer/Drive.pm
index 1041c1dd..8ff44641 100644
--- a/PVE/QemuServer/Drive.pm
+++ b/PVE/QemuServer/Drive.pm
@@ -998,4 +998,42 @@ sub get_scsi_device_type {
 
     return $devicetype;
 }
+
+sub vm_is_volid_owner {
+    my ($storecfg, $vmid, $volid) = @_;
+
+    if ($volid !~  m|^/|) {
+	my ($path, $owner);
+	eval { ($path, $owner) = PVE::Storage::path($storecfg, $volid); };
+	if ($owner && ($owner == $vmid)) {
+	    return 1;
+	}
+    }
+
+    return;
+}
+
+sub try_deallocate_drive {
+    my ($storecfg, $vmid, $conf, $key, $drive, $rpcenv, $authuser, $force) = @_;
+
+    if (($force || $key =~ /^unused/) && !drive_is_cdrom($drive, 1)) {
+	my $volid = $drive->{file};
+	if (vm_is_volid_owner($storecfg, $vmid, $volid)) {
+	    my $sid = PVE::Storage::parse_volume_id($volid);
+	    $rpcenv->check($authuser, "/storage/$sid", ['Datastore.AllocateSpace']);
+
+	    # check if the disk is really unused
+	    die "unable to delete '$volid' - volume is still in use (snapshot?)\n"
+		if is_volume_in_use($storecfg, $conf, $key, $volid);
+	    PVE::Storage::vdisk_free($storecfg, $volid);
+	    return 1;
+	} else {
+	    # If vm is not owner of this disk remove from config
+	    return 1;
+	}
+    }
+
+    return;
+}
+
 1;
-- 
2.39.5





More information about the pve-devel mailing list