[pve-devel] [PATCH 8/8] add_unused_volume corrections.
Derumier Alexandre
aderumier at odiso.com
Fri Jan 20 11:42:09 CET 2012
Currentle add_unused_volume not working when delete more than 1 device.
As it reading the vm conf file each time, it always assign the same id to each delete device.
So I add a new sub, load_unused_volume to load in memory the unused volume
and then not passing config anymore to add_unused_volume
Signed-off-by: Derumier Alexandre <aderumier at odiso.com>
---
PVE/API2/Qemu.pm | 11 ++++++++---
PVE/QemuServer.pm | 28 ++++++++++++++++++++++++++--
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 8b972a3..c519a32 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -501,6 +501,8 @@ __PACKAGE__->register_method({
PVE::Cluster::log_msg('info', $user, "update VM $vmid: " . join (' ', @paramarr));
+ PVE::QemuServer::load_unused_volume($conf, $param);
+
my @newdelete = ();
foreach my $opt (PVE::Tools::split_list($delete)) {
if(PVE::QemuServer::vm_deviceunplug($vmid, $conf, $opt)) {
@@ -531,7 +533,7 @@ __PACKAGE__->register_method({
my ($path, $owner);
eval { ($path, $owner) = PVE::Storage::path($storecfg, $old_drive->{file}); };
if ($owner && ($owner == $vmid)) {
- PVE::QemuServer::add_unused_volume($conf, $param, $old_drive->{file});
+ PVE::QemuServer::add_unused_volume($param, $old_drive->{file});
}
}
}
@@ -558,7 +560,7 @@ __PACKAGE__->register_method({
if ($force) {
push @$vollist, $volid;
} else {
- PVE::QemuServer::add_unused_volume($conf, $param, $volid);
+ PVE::QemuServer::add_unused_volume($param, $volid);
}
}
}
@@ -574,13 +576,16 @@ __PACKAGE__->register_method({
#hotplug disks
foreach my $opt (keys %$param) {
- if($opt =~ m/^(scsi|virtio)(\d+)$/) {
+ if (PVE::QemuServer::valid_drivename($opt)) {
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);
}
+ else {
+ PVE::QemuServer::del_unused_volume($param, $device->{file});
+ }
}
}
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index f714cc8..865938b 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -1019,12 +1019,12 @@ sub add_random_macs {
}
sub add_unused_volume {
- my ($config, $res, $volid) = @_;
+ my ($res, $volid) = @_;
my $key;
for (my $ind = $MAX_UNUSED_DISKS - 1; $ind >= 0; $ind--) {
my $test = "unused$ind";
- if (my $vid = $config->{$test}) {
+ if (my $vid = $res->{$test}) {
return if $vid eq $volid; # do not add duplicates
} else {
$key = $test;
@@ -1036,6 +1036,30 @@ sub add_unused_volume {
$res->{$key} = $volid;
}
+sub del_unused_volume {
+ my ($res, $volid) = @_;
+
+ my $key;
+ for (my $ind = $MAX_UNUSED_DISKS - 1; $ind >= 0; $ind--) {
+ my $test = "unused$ind";
+ if (my $vid = $res->{$test}) {
+ delete $res->{$test} if $vid eq $volid;
+ }
+ }
+}
+
+sub load_unused_volume {
+ my ($config, $res) = @_;
+
+ my $key;
+ for (my $ind = $MAX_UNUSED_DISKS - 1; $ind >= 0; $ind--) {
+ my $key = "unused$ind";
+ if (my $vid = $config->{$key}) {
+ $res->{$key} = $vid;
+ }
+ }
+}
+
# fixme: remove all thos $noerr parameters?
PVE::JSONSchema::register_format('pve-qm-bootdisk', \&verify_bootdisk);
--
1.7.2.5
More information about the pve-devel
mailing list