No the plugin also returns the parent vmid and base volume when a link clone is 
used
---
 PVE/Storage.pm               |  2 +-
 PVE/Storage/ZFSPoolPlugin.pm | 17 +++++++++++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index e7ff5a0..3c233d3 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -295,7 +295,7 @@ sub parse_volname {
 
     # returns ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format)
 
-    return $plugin->parse_volname($volname);
+    return $plugin->parse_volname($volname, $cfg->{ids}->{$storeid}->{pool});
 }
 
 sub parse_volume_id {
diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm
index 9f76cee..05920aa 100644
--- a/PVE/Storage/ZFSPoolPlugin.pm
+++ b/PVE/Storage/ZFSPoolPlugin.pm
@@ -127,11 +127,24 @@ sub zfs_parse_zvol_list {
 }
 
 sub parse_volname {
-    my ($class, $volname) = @_;
+    my ($class, $volname, $pool) = @_;
 
     if ($volname =~ 
m/^(((base|vm)-(\d+)-\S+)\/)?((base)?(vm|subvol)?-(\d+)-\S+)$/) {
        my $format = $7 && $7 eq 'subvol' ? 'subvol' : 'raw';
-       return ('images', $5, $8, $2, $4, $6, $format);
+
+       my $base;
+       my $vmid;
+       if ($pool) {
+           my $cfg = PVE::Cluster::cfs_read_file("storage.cfg");
+           my $res = zfs_request($class, $cfg, undef, 'get', ('-H', 'origin', 
"$pool\/$volname"));
+
+           $base = $1 ne '-' ? $1 : undef if $res =~ m/\s+origin\s+(\S+)\s+/;
+
+           if ($base) {
+               $vmid = $1 ne '-' ? $1 : undef if $base =~ m/-(\d+)-disk-\d+/;
+           }
+       }
+       return ('images', $5, $8, $base, $vmid, $6, $format);
     }
 
     die "unable to parse zfs volume name '$volname'\n";
-- 
2.1.4


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to