[pve-devel] [PATCH v2 storage 2/5] move check for existing clones into own method
Fabian Grünbichler
f.gruenbichler at proxmox.com
Thu Sep 15 13:17:45 CEST 2016
and change its return type to boolean
---
PVE/Storage.pm | 62 ++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 41 insertions(+), 21 deletions(-)
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 273d17d..16a835f 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -341,6 +341,44 @@ sub parse_volume_id {
return PVE::Storage::Plugin::parse_volume_id($volid, $noerr);
}
+my $volume_is_base_and_used = sub {
+ my ($scfg, $storeid, $plugin, $volname) = @_;
+
+ my ($vtype, $name, $vmid, undef, undef, $isBase, undef) =
+ $plugin->parse_volname($volname);
+
+ if ($isBase) {
+ my $vollist = $plugin->list_images($storeid, $scfg);
+ foreach my $info (@$vollist) {
+ my (undef, $tmpvolname) = parse_volume_id($info->{volid});
+ my $basename = undef;
+ my $basevmid = undef;
+
+ eval{
+ (undef, undef, undef, $basename, $basevmid) =
+ $plugin->parse_volname($tmpvolname);
+ };
+
+ if ($basename && defined($basevmid) && $basevmid == $vmid && $basename eq $name) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+};
+
+sub volume_is_base_and_used {
+ my ($cfg, $volid) = @_;
+
+ my ($storeid, $volname) = parse_volume_id($volid);
+ my $scfg = storage_config($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ $plugin->cluster_lock_storage($storeid, $scfg->{shared}, undef, sub {
+ return &$volume_is_base_and_used($scfg, $storeid, $plugin, $volname);
+ });
+}
+
# try to map a filesystem path to a volume identifier
sub path_to_volume_id {
my ($cfg, $path) = @_;
@@ -661,9 +699,7 @@ sub vdisk_free {
my ($cfg, $volid) = @_;
my ($storeid, $volname) = parse_volume_id($volid);
-
my $scfg = storage_config($cfg, $storeid);
-
my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
activate_storage($cfg, $storeid);
@@ -672,27 +708,11 @@ sub vdisk_free {
# lock shared storage
$plugin->cluster_lock_storage($storeid, $scfg->{shared}, undef, sub {
+ die "base volume '$volname' is still in use by linked clones\n"
+ if &$volume_is_base_and_used($scfg, $storeid, $plugin, $volname);
- my ($vtype, $name, $vmid, undef, undef, $isBase, $format) =
+ my (undef, undef, undef, undef, undef, $isBase, $format) =
$plugin->parse_volname($volname);
- if ($isBase) {
- my $vollist = $plugin->list_images($storeid, $scfg);
- foreach my $info (@$vollist) {
- my (undef, $tmpvolname) = parse_volume_id($info->{volid});
- my $basename = undef;
- my $basevmid = undef;
-
- eval{
- (undef, undef, undef, $basename, $basevmid) =
- $plugin->parse_volname($tmpvolname);
- };
-
- if ($basename && defined($basevmid) && $basevmid == $vmid && $basename eq $name) {
- die "base volume '$volname' is still in use " .
- "(used by '$tmpvolname')\n";
- }
- }
- }
$cleanup_worker = $plugin->free_image($storeid, $scfg, $volname, $isBase, $format);
});
--
2.1.4
More information about the pve-devel
mailing list