[pve-devel] [PATCH 7/8] rework of hotplug/unplug in Qemu.pm

Derumier Alexandre aderumier at odiso.com
Fri Jan 20 11:42:08 CET 2012


manage errors on more than 1 device
use unused disk for new created disk but failed hotplug

Signed-off-by: Derumier Alexandre <aderumier at odiso.com>
---
 PVE/API2/Qemu.pm  |   28 +++++++++++++++++++++++++++-
 PVE/QemuServer.pm |    1 -
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 518a982..8b972a3 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -439,6 +439,7 @@ __PACKAGE__->register_method({
 
 	my $digest = extract_param($param, 'digest');
 
+        my @hotplugerr = ();
 	my @paramarr = (); # used for log message
 	foreach my $key (keys %$param) {
 	    push @paramarr, "-$key", $param->{$key};
@@ -500,6 +501,17 @@ __PACKAGE__->register_method({
 
 	    PVE::Cluster::log_msg('info', $user, "update VM $vmid: " . join (' ', @paramarr));
 
+            my @newdelete = ();
+            foreach my $opt (PVE::Tools::split_list($delete)) {
+               if(PVE::QemuServer::vm_deviceunplug($vmid, $conf, $opt)) {
+                    push(@newdelete, $opt);
+               }
+               else {
+                    push(@hotplugerr, $opt);
+               }
+            }
+            $delete = join(',', @newdelete) if scalar(@newdelete) > 0;
+
 	    foreach my $opt (keys %$eject) {
 		if ($conf->{$opt}) {
 		    my $drive = PVE::QemuServer::parse_drive($opt, $conf->{$opt});
@@ -533,7 +545,6 @@ __PACKAGE__->register_method({
 		} 
 		next if !defined($conf->{$opt});
 		if (PVE::QemuServer::valid_drivename($opt)) {
-		    PVE::QemuServer::vm_deviceunplug($vmid, $conf, $opt);
 		    my $drive = PVE::QemuServer::parse_drive($opt, $conf->{$opt});
 		    if (PVE::QemuServer::drive_is_cdrom($drive)) {
 			$cdchange->{$opt} = undef;
@@ -561,6 +572,18 @@ __PACKAGE__->register_method({
 
 	    PVE::QemuServer::create_disks($storecfg, $vmid, $param, $conf);
 
+            #hotplug disks
+            foreach my $opt (keys %$param) {
+                if($opt =~ m/^(scsi|virtio)(\d+)$/) {
+                   my $device = PVE::QemuServer::parse_drive($opt, $param->{$opt});
+                   if(!PVE::QemuServer::vm_deviceplug($storecfg, $conf, $vmid, $opt, $device)) {
+                       $unset->{$opt} = 1;
+                       PVE::QemuServer::add_unused_volume($param, $device->{file});
+                       push(@hotplugerr, $opt);
+                   }
+                }
+            }
+
 	    PVE::QemuServer::change_config_nolock($vmid, $param, $unset, 1);
 
 	    return if !PVE::QemuServer::check_running($vmid);
@@ -581,6 +604,9 @@ __PACKAGE__->register_method({
 	    warn $@ if $@;
 	}
 
+        raise_param_exc({ hotplug => "error hotplug/unplug ".join(',', @hotplugerr)})
+            if scalar(@hotplugerr) > 0;
+
 	return undef;
     }});
 
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 0d521d6..f714cc8 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -1290,7 +1290,6 @@ sub create_disks {
 		    die "image '$path' does not exists\n";
 		}
 	    }
-	    PVE::QemuServer::vm_deviceplug($storecfg, $conf, $vmid, $ds, $disk) if defined($conf);
 	});
     };
 
-- 
1.7.2.5




More information about the pve-devel mailing list