[pve-devel] [PATCH rebased container] Refactor lock_container into lock_config_[xx]

Fabian Grünbichler f.gruenbichler at proxmox.com
Thu Feb 11 14:37:41 CET 2016


Subject: [PATCH rebased container] Refactor lock_container into lock_config_[xx]

This mimics the "signatures" of the methods in
QemuServer.pm, and should allow us to use this methods in a
future abstract "Guest" class.

It also changes the various timeouts (ranging from 1, 10, 60
to undef) to use the default timeout defined in the
lock_config methods (10).

Also drop the now unused use statement for flock.
---
Note: this requires the "Add missing use statement" patch,
because the calls to lock_file[_full] are unqualified now.

Rebased on current master.

 src/PVE/API2/LXC.pm          | 10 +++++-----
 src/PVE/API2/LXC/Config.pm   |  2 +-
 src/PVE/API2/LXC/Snapshot.pm |  2 +-
 src/PVE/API2/LXC/Status.pm   |  8 ++++----
 src/PVE/CLI/pct.pm           |  4 ++--
 src/PVE/LXC.pm               | 42 ++++++++++++++++++++++++++++++------------
 src/PVE/LXC/Migrate.pm       |  2 +-
 src/PVE/VZDump/LXC.pm        |  4 ++--
 8 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
index 7db8488..32151c8 100644
--- a/src/PVE/API2/LXC.pm
+++ b/src/PVE/API2/LXC.pm
@@ -325,7 +325,7 @@ __PACKAGE__->register_method({
 	    PVE::AccessControl::add_vm_to_pool($vmid, $pool) if $pool;
 	};
 
-	my $realcmd = sub { PVE::LXC::lock_container($vmid, 1, $code); };
+	my $realcmd = sub { PVE::LXC::lock_config($vmid, $code); };
 
 	&$check_vmid_usage(); # first check before locking
 
@@ -528,7 +528,7 @@ __PACKAGE__->register_method({
 	    PVE::Firewall::remove_vmfw_conf($vmid);
 	};
 
-	my $realcmd = sub { PVE::LXC::lock_container($vmid, 1, $code); };
+	my $realcmd = sub { PVE::LXC::lock_config($vmid, $code); };
 	
 	return $rpcenv->fork_worker('vzdestroy', $vmid, $authuser, $realcmd);
     }});
@@ -947,7 +947,7 @@ __PACKAGE__->register_method({
 	    return $rpcenv->fork_worker('vztemplate', $vmid, $authuser, $realcmd);
 	};
 
-	PVE::LXC::lock_container($vmid, undef, $updatefn);
+	PVE::LXC::lock_config($vmid, $updatefn);
 
 	return undef;
     }});
@@ -1186,7 +1186,7 @@ __PACKAGE__->register_method({
 
 	};
 
-	return PVE::LXC::lock_container($vmid, undef, $clonefn);
+	return PVE::LXC::lock_config($vmid, $clonefn);
     }});
 
 
@@ -1334,7 +1334,7 @@ __PACKAGE__->register_method({
 	    return $rpcenv->fork_worker('resize', $vmid, $authuser, $realcmd);
 	};
 
-	return PVE::LXC::lock_container($vmid, undef, $code);;
+	return PVE::LXC::lock_config($vmid, $code);;
     }});
 
 1;
diff --git a/src/PVE/API2/LXC/Config.pm b/src/PVE/API2/LXC/Config.pm
index 1a1190c..8e9295b 100644
--- a/src/PVE/API2/LXC/Config.pm
+++ b/src/PVE/API2/LXC/Config.pm
@@ -143,7 +143,7 @@ __PACKAGE__->register_method({
 	    PVE::LXC::update_lxc_config($storage_cfg, $vmid, $conf);
 	};
 
-	PVE::LXC::lock_container($vmid, undef, $code);
+	PVE::LXC::lock_config($vmid, $code);
 
 	return undef;
     }});
diff --git a/src/PVE/API2/LXC/Snapshot.pm b/src/PVE/API2/LXC/Snapshot.pm
index 36bbbf7..49fd4f5 100644
--- a/src/PVE/API2/LXC/Snapshot.pm
+++ b/src/PVE/API2/LXC/Snapshot.pm
@@ -311,7 +311,7 @@ __PACKAGE__->register_method({
 	    PVE::LXC::write_config($vmid, $conf, 1);
 	};
 
-	PVE::LXC::lock_container($vmid, 10, $updatefn);
+	PVE::LXC::lock_config($vmid, $updatefn);
 
 	return undef;
     }});
diff --git a/src/PVE/API2/LXC/Status.pm b/src/PVE/API2/LXC/Status.pm
index cd7f04d..e91ac7c 100644
--- a/src/PVE/API2/LXC/Status.pm
+++ b/src/PVE/API2/LXC/Status.pm
@@ -186,7 +186,7 @@ __PACKAGE__->register_method({
 		return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd);
 	    };
 
-	    return PVE::LXC::lock_container($vmid, 10, $lockcmd);
+	    return PVE::LXC::lock_config($vmid, $lockcmd);
 	}
     }});
 
@@ -268,7 +268,7 @@ __PACKAGE__->register_method({
 		return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd);
 	    };
 
-	    return PVE::LXC::lock_container($vmid, 10, $lockcmd);
+	    return PVE::LXC::lock_config($vmid, $lockcmd);
 	}
     }});
 
@@ -361,7 +361,7 @@ __PACKAGE__->register_method({
 	    return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd);
 	};
 
-	return PVE::LXC::lock_container($vmid, 10, $lockcmd);
+	return PVE::LXC::lock_config($vmid, $lockcmd);
     }});
 
 __PACKAGE__->register_method({
@@ -417,7 +417,7 @@ __PACKAGE__->register_method({
 	    return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd);
 	};
 
-	return PVE::LXC::lock_container($vmid, 10, $lockcmd);
+	return PVE::LXC::lock_config($vmid, $lockcmd);
     }});
 
 __PACKAGE__->register_method({
diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm
index e7a2292..b2bc361 100755
--- a/src/PVE/CLI/pct.pm
+++ b/src/PVE/CLI/pct.pm
@@ -44,7 +44,7 @@ __PACKAGE__->register_method ({
 
 	my $vmid = $param->{vmid};
 
-	PVE::LXC::lock_container($vmid, 5, sub {
+	PVE::LXC::lock_config($vmid, sub {
 	    my $conf = PVE::LXC::load_config($vmid);
 	    delete $conf->{lock};
 	    PVE::LXC::write_config($vmid, $conf);
@@ -199,7 +199,7 @@ __PACKAGE__->register_method ({
 	    PVE::Tools::run_command($command);
 	};
 
-	PVE::LXC::lock_container($vmid, undef, $do_fsck);
+	PVE::LXC::lock_config($vmid, $do_fsck);
 	return undef;
     }});
 
diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index 1ef8a08..e701202 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -9,7 +9,7 @@ use Socket;
 use File::Path;
 use File::Spec;
 use Cwd qw();
-use Fcntl qw(O_RDONLY :flock);
+use Fcntl qw(O_RDONLY);
 
 use PVE::Cluster qw(cfs_register_file cfs_read_file);
 use PVE::Storage;
@@ -646,28 +646,46 @@ sub write_config {
 my $lock_handles =  {};
 my $lockdir = "/run/lock/lxc";
 
-sub lock_filename {
+sub config_file_lock {
     my ($vmid) = @_;
 
     return "$lockdir/pve-config-${vmid}.lock";
 }
 
-sub lock_container {
+sub lock_config_full {
     my ($vmid, $timeout, $code, @param) = @_;
 
-    $timeout = 10 if !$timeout;
+    my $filename = config_file_lock($vmid);
 
-    my $filename = lock_filename($vmid);
+    mkdir $lockdir if !-d $lockdir;
+
+    my $res = lock_file($filename, $timeout, $code, @param);
+
+    die $@ if $@;
+
+    return $res;
+}
+
+sub lock_config_mode {
+    my ($vmid, $timeout, $shared, $code, @param) = @_;
+
+    my $filename = config_file_lock($vmid);
 
     mkdir $lockdir if !-d $lockdir;
 
-    my $res = PVE::Tools::lock_file_full($filename, $timeout, 0, $code,
@param);
+    my $res = lock_file_full($filename, $timeout, $shared, $code, @param);
 
     die $@ if $@;
 
     return $res;
 }
 
+sub lock_config {
+    my ($vmid, $code, @param) = @_;
+
+    return lock_config_full($vmid, 10, $code, @param);
+}
+
 sub option_exists {
     my ($name) = @_;
 
@@ -1732,7 +1750,7 @@ my $snapshot_prepare = sub {
 	write_config($vmid, $conf);
     };
 
-    lock_container($vmid, 10, $updatefn);
+    lock_config($vmid, $updatefn);
 
     return $snap;
 };
@@ -1761,7 +1779,7 @@ my $snapshot_commit = sub {
 	write_config($vmid, $conf);
     };
 
-    lock_container($vmid, 10 ,$updatefn);
+    lock_config($vmid ,$updatefn);
 };
 
 sub has_feature {
@@ -1927,7 +1945,7 @@ sub snapshot_delete {
 	write_config($vmid, $conf);
     };
 
-    lock_container($vmid, 10, $updatefn);
+    lock_config($vmid, $updatefn);
 
     my $storecfg = PVE::Storage::config();
 
@@ -1976,7 +1994,7 @@ sub snapshot_delete {
     my $err = $@;
 
     if(!$err || ($err && $force)) {
-	lock_container($vmid, 10, $del_snap);
+	lock_config($vmid, $del_snap);
 	if ($err) {
 	    die "Can't delete snapshot: $vmid $snapname $err\n";
 	}
@@ -2035,11 +2053,11 @@ sub snapshot_rollback {
 	write_config($vmid, $conf);
     };
 
-    lock_container($vmid, 10, $updatefn);
+    lock_config($vmid, $updatefn);
 
     PVE::Storage::volume_snapshot_rollback($storecfg, $volid, $snapname);
 
-    lock_container($vmid, 5, $unlockfn);
+    lock_config($vmid, $unlockfn);
 }
 
 sub template_create {
diff --git a/src/PVE/LXC/Migrate.pm b/src/PVE/LXC/Migrate.pm
index 58e4ea2..94d53a2 100644
--- a/src/PVE/LXC/Migrate.pm
+++ b/src/PVE/LXC/Migrate.pm
@@ -16,7 +16,7 @@ use base qw(PVE::AbstractMigrate);
 sub lock_vm {
     my ($self, $vmid, $code, @param) = @_;
 
-    return PVE::LXC::lock_container($vmid, undef, $code, @param);
+    return PVE::LXC::lock_config($vmid, $code, @param);
 }
 
 sub prepare {
diff --git a/src/PVE/VZDump/LXC.pm b/src/PVE/VZDump/LXC.pm
index 57dcbe2..0979f15 100644
--- a/src/PVE/VZDump/LXC.pm
+++ b/src/PVE/VZDump/LXC.pm
@@ -185,7 +185,7 @@ sub lock_vm {
 	PVE::LXC::write_config($vmid, $conf);
     };
 
-    PVE::LXC::lock_container($vmid, 10, $lockconfig, ($self, $vmid));
+    PVE::LXC::lock_config($vmid, $lockconfig, ($self, $vmid));
 }
 
 sub unlock_vm {
@@ -202,7 +202,7 @@ sub unlock_vm {
 	}
     };
 
-    PVE::LXC::lock_container($vmid, 60, $unlockconfig, ($self, $vmid));
+    PVE::LXC::lock_config($vmid, $unlockconfig, ($self, $vmid));
 }
 
 sub snapshot {
-- 
2.1.4
> Fabian Grünbichler <f.gruenbichler at proxmox.com> hat am 11. Februar 2016 um
> 12:55 geschrieben:
> 
> 
> This mimics the "signatures" of the methods in
> QemuServer.pm, and should allow us to use this methods in a
> future abstract "Guest" class.
> 
> It also changes the various timeouts (ranging from 1, 10, 60
> to undef) to use the default timeout defined in the
> lock_config methods (10).
> 
> Also drop the now unused use statement for flock.
> ---
> Note: this requires the "Add missing use statement" patch,
> because the calls to lock_file[_full] are unqualified now.
> 
>  src/PVE/API2/LXC.pm          | 10 +++++-----
>  src/PVE/API2/LXC/Config.pm   |  2 +-
>  src/PVE/API2/LXC/Snapshot.pm |  2 +-
>  src/PVE/API2/LXC/Status.pm   |  8 ++++----
>  src/PVE/CLI/pct.pm           |  4 ++--
>  src/PVE/LXC.pm               | 41 +++++++++++++++++++++++++++++------------
>  src/PVE/LXC/Migrate.pm       |  2 +-
>  src/PVE/VZDump/LXC.pm        |  4 ++--
>  8 files changed, 45 insertions(+), 28 deletions(-)
> 
> diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
> index 7db8488..32151c8 100644
> --- a/src/PVE/API2/LXC.pm
> +++ b/src/PVE/API2/LXC.pm
> @@ -325,7 +325,7 @@ __PACKAGE__->register_method({
>  	    PVE::AccessControl::add_vm_to_pool($vmid, $pool) if $pool;
>  	};
>  
> -	my $realcmd = sub { PVE::LXC::lock_container($vmid, 1, $code); };
> +	my $realcmd = sub { PVE::LXC::lock_config($vmid, $code); };
>  
>  	&$check_vmid_usage(); # first check before locking
>  
> @@ -528,7 +528,7 @@ __PACKAGE__->register_method({
>  	    PVE::Firewall::remove_vmfw_conf($vmid);
>  	};
>  
> -	my $realcmd = sub { PVE::LXC::lock_container($vmid, 1, $code); };
> +	my $realcmd = sub { PVE::LXC::lock_config($vmid, $code); };
>  	
>  	return $rpcenv->fork_worker('vzdestroy', $vmid, $authuser, $realcmd);
>      }});
> @@ -947,7 +947,7 @@ __PACKAGE__->register_method({
>  	    return $rpcenv->fork_worker('vztemplate', $vmid, $authuser, $realcmd);
>  	};
>  
> -	PVE::LXC::lock_container($vmid, undef, $updatefn);
> +	PVE::LXC::lock_config($vmid, $updatefn);
>  
>  	return undef;
>      }});
> @@ -1186,7 +1186,7 @@ __PACKAGE__->register_method({
>  
>  	};
>  
> -	return PVE::LXC::lock_container($vmid, undef, $clonefn);
> +	return PVE::LXC::lock_config($vmid, $clonefn);
>      }});
>  
>  
> @@ -1334,7 +1334,7 @@ __PACKAGE__->register_method({
>  	    return $rpcenv->fork_worker('resize', $vmid, $authuser, $realcmd);
>  	};
>  
> -	return PVE::LXC::lock_container($vmid, undef, $code);;
> +	return PVE::LXC::lock_config($vmid, $code);;
>      }});
>  
>  1;
> diff --git a/src/PVE/API2/LXC/Config.pm b/src/PVE/API2/LXC/Config.pm
> index 1a1190c..8e9295b 100644
> --- a/src/PVE/API2/LXC/Config.pm
> +++ b/src/PVE/API2/LXC/Config.pm
> @@ -143,7 +143,7 @@ __PACKAGE__->register_method({
>  	    PVE::LXC::update_lxc_config($storage_cfg, $vmid, $conf);
>  	};
>  
> -	PVE::LXC::lock_container($vmid, undef, $code);
> +	PVE::LXC::lock_config($vmid, $code);
>  
>  	return undef;
>      }});
> diff --git a/src/PVE/API2/LXC/Snapshot.pm b/src/PVE/API2/LXC/Snapshot.pm
> index 36bbbf7..49fd4f5 100644
> --- a/src/PVE/API2/LXC/Snapshot.pm
> +++ b/src/PVE/API2/LXC/Snapshot.pm
> @@ -311,7 +311,7 @@ __PACKAGE__->register_method({
>  	    PVE::LXC::write_config($vmid, $conf, 1);
>  	};
>  
> -	PVE::LXC::lock_container($vmid, 10, $updatefn);
> +	PVE::LXC::lock_config($vmid, $updatefn);
>  
>  	return undef;
>      }});
> diff --git a/src/PVE/API2/LXC/Status.pm b/src/PVE/API2/LXC/Status.pm
> index cd7f04d..e91ac7c 100644
> --- a/src/PVE/API2/LXC/Status.pm
> +++ b/src/PVE/API2/LXC/Status.pm
> @@ -186,7 +186,7 @@ __PACKAGE__->register_method({
>  		return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd);
>  	    };
>  
> -	    return PVE::LXC::lock_container($vmid, 10, $lockcmd);
> +	    return PVE::LXC::lock_config($vmid, $lockcmd);
>  	}
>      }});
>  
> @@ -268,7 +268,7 @@ __PACKAGE__->register_method({
>  		return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd);
>  	    };
>  
> -	    return PVE::LXC::lock_container($vmid, 10, $lockcmd);
> +	    return PVE::LXC::lock_config($vmid, $lockcmd);
>  	}
>      }});
>  
> @@ -361,7 +361,7 @@ __PACKAGE__->register_method({
>  	    return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd);
>  	};
>  
> -	return PVE::LXC::lock_container($vmid, 10, $lockcmd);
> +	return PVE::LXC::lock_config($vmid, $lockcmd);
>      }});
>  
>  __PACKAGE__->register_method({
> @@ -417,7 +417,7 @@ __PACKAGE__->register_method({
>  	    return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd);
>  	};
>  
> -	return PVE::LXC::lock_container($vmid, 10, $lockcmd);
> +	return PVE::LXC::lock_config($vmid, $lockcmd);
>      }});
>  
>  __PACKAGE__->register_method({
> diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm
> index e7a2292..b2bc361 100755
> --- a/src/PVE/CLI/pct.pm
> +++ b/src/PVE/CLI/pct.pm
> @@ -44,7 +44,7 @@ __PACKAGE__->register_method ({
>  
>  	my $vmid = $param->{vmid};
>  
> -	PVE::LXC::lock_container($vmid, 5, sub {
> +	PVE::LXC::lock_config($vmid, sub {
>  	    my $conf = PVE::LXC::load_config($vmid);
>  	    delete $conf->{lock};
>  	    PVE::LXC::write_config($vmid, $conf);
> @@ -199,7 +199,7 @@ __PACKAGE__->register_method ({
>  	    PVE::Tools::run_command($command);
>  	};
>  
> -	PVE::LXC::lock_container($vmid, undef, $do_fsck);
> +	PVE::LXC::lock_config($vmid, $do_fsck);
>  	return undef;
>      }});
>  
> diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
> index a2cb67d..74d15da 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -7,7 +7,6 @@ use POSIX qw(EINTR);
>  use File::Path;
>  use File::Spec;
>  use Cwd qw();
> -use Fcntl ':flock';
>  
>  use PVE::Cluster qw(cfs_register_file cfs_read_file);
>  use PVE::Storage;
> @@ -638,28 +637,46 @@ sub write_config {
>  my $lock_handles =  {};
>  my $lockdir = "/run/lock/lxc";
>  
> -sub lock_filename {
> +sub config_file_lock {
>      my ($vmid) = @_;
>  
>      return "$lockdir/pve-config-${vmid}.lock";
>  }
>  
> -sub lock_container {
> +sub lock_config_full {
>      my ($vmid, $timeout, $code, @param) = @_;
>  
> -    $timeout = 10 if !$timeout;
> +    my $filename = config_file_lock($vmid);
>  
> -    my $filename = lock_filename($vmid);
> +    mkdir $lockdir if !-d $lockdir;
> +
> +    my $res = lock_file($filename, $timeout, $code, @param);
> +
> +    die $@ if $@;
> +
> +    return $res;
> +}
> +
> +sub lock_config_mode {
> +    my ($vmid, $timeout, $shared, $code, @param) = @_;
> +
> +    my $filename = config_file_lock($vmid);
>  
>      mkdir $lockdir if !-d $lockdir;
>  
> -    my $res = PVE::Tools::lock_file_full($filename, $timeout, 0, $code,
> @param);
> +    my $res = lock_file_full($filename, $timeout, $shared, $code, @param);
>  
>      die $@ if $@;
>  
>      return $res;
>  }
>  
> +sub lock_config {
> +    my ($vmid, $code, @param) = @_;
> +
> +    return lock_config_full($vmid, 10, $code, @param);
> +}
> +
>  sub option_exists {
>      my ($name) = @_;
>  
> @@ -1730,7 +1747,7 @@ my $snapshot_prepare = sub {
>  	write_config($vmid, $conf);
>      };
>  
> -    lock_container($vmid, 10, $updatefn);
> +    lock_config($vmid, $updatefn);
>  
>      return $snap;
>  };
> @@ -1759,7 +1776,7 @@ my $snapshot_commit = sub {
>  	write_config($vmid, $conf);
>      };
>  
> -    lock_container($vmid, 10 ,$updatefn);
> +    lock_config($vmid ,$updatefn);
>  };
>  
>  sub has_feature {
> @@ -1856,7 +1873,7 @@ sub snapshot_delete {
>  	write_config($vmid, $conf);
>      };
>  
> -    lock_container($vmid, 10, $updatefn);
> +    lock_config($vmid, $updatefn);
>  
>      my $storecfg = PVE::Storage::config();
>  
> @@ -1905,7 +1922,7 @@ sub snapshot_delete {
>      my $err = $@;
>  
>      if(!$err || ($err && $force)) {
> -	lock_container($vmid, 10, $del_snap);
> +	lock_config($vmid, $del_snap);
>  	if ($err) {
>  	    die "Can't delete snapshot: $vmid $snapname $err\n";
>  	}
> @@ -1964,11 +1981,11 @@ sub snapshot_rollback {
>  	write_config($vmid, $conf);
>      };
>  
> -    lock_container($vmid, 10, $updatefn);
> +    lock_config($vmid, $updatefn);
>  
>      PVE::Storage::volume_snapshot_rollback($storecfg, $volid, $snapname);
>  
> -    lock_container($vmid, 5, $unlockfn);
> +    lock_config($vmid, $unlockfn);
>  }
>  
>  sub template_create {
> diff --git a/src/PVE/LXC/Migrate.pm b/src/PVE/LXC/Migrate.pm
> index 58e4ea2..94d53a2 100644
> --- a/src/PVE/LXC/Migrate.pm
> +++ b/src/PVE/LXC/Migrate.pm
> @@ -16,7 +16,7 @@ use base qw(PVE::AbstractMigrate);
>  sub lock_vm {
>      my ($self, $vmid, $code, @param) = @_;
>  
> -    return PVE::LXC::lock_container($vmid, undef, $code, @param);
> +    return PVE::LXC::lock_config($vmid, $code, @param);
>  }
>  
>  sub prepare {
> diff --git a/src/PVE/VZDump/LXC.pm b/src/PVE/VZDump/LXC.pm
> index 57dcbe2..0979f15 100644
> --- a/src/PVE/VZDump/LXC.pm
> +++ b/src/PVE/VZDump/LXC.pm
> @@ -185,7 +185,7 @@ sub lock_vm {
>  	PVE::LXC::write_config($vmid, $conf);
>      };
>  
> -    PVE::LXC::lock_container($vmid, 10, $lockconfig, ($self, $vmid));
> +    PVE::LXC::lock_config($vmid, $lockconfig, ($self, $vmid));
>  }
>  
>  sub unlock_vm {
> @@ -202,7 +202,7 @@ sub unlock_vm {
>  	}
>      };
>  
> -    PVE::LXC::lock_container($vmid, 60, $unlockconfig, ($self, $vmid));
> +    PVE::LXC::lock_config($vmid, $unlockconfig, ($self, $vmid));
>  }
>  
>  sub snapshot {
> -- 
> 2.1.4
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>




More information about the pve-devel mailing list