From 5e4791804c4d0291b27b18faf95ac03aa2b91a35 Mon Sep 17 00:00:00 2001 From: Pablo Ruiz Garcia Date: Sun, 23 Feb 2014 00:00:43 +0100 Subject: [PATCH] Improve parsing of zfs volumes (ZVOLs) in order to avoid filtering of zvols nested under another ZFS dataset. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The actual code would only accept zvols like: POOL/vm-123-disk-1. However, using POOL/DataSet/vm-123-disk-1 allows setting specific proparties at POOL/DataSet level (like compression, etc.) which would be inherited by any zvol created under such DataSet. This allows more flexibility of zfs/zvol's management. Signed-off-by: Pablo Ruiz GarcĂ­a --- PVE/Storage/ZFSPlugin.pm | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm index d077cfb..4a8e9e4 100644 --- a/PVE/Storage/ZFSPlugin.pm +++ b/PVE/Storage/ZFSPlugin.pm @@ -151,23 +151,22 @@ sub zfs_parse_zvol_list { foreach my $line (@lines) { if ($line =~ /^(.+)\s+([a-zA-Z0-9\.]+|\-)\s+(.+)$/) { my $zvol = {}; - my $name; - my $disk; - my @zvols = split /\//, $1; - my $pool = $zvols[0]; + my @parts = split /\//, $1; + my $name = pop @parts; + my $pool = join('/', @parts); - if (scalar(@zvols) == 2 && $zvols[0] !~ /^rpool$/) { - $disk = $zvols[1]; - next unless $disk =~ m!^(\w+)-(\d+)-(\w+)-(\d+)$!; - $name = $pool . '/' . $disk; + if ($pool !~ /^rpool$/) { + next unless $name =~ m!^(\w+)-(\d+)-(\w+)-(\d+)$!; + $name = $pool . '/' . $name; } else { - next; + next; } + $zvol->{pool} = $pool; $zvol->{name} = $name; $zvol->{size} = zfs_parse_size($2); if ($3 !~ /^-$/) { - $zvol->{origin} = $3; + $zvol->{origin} = $3; } push @$list, $zvol; } @@ -271,7 +270,7 @@ sub zfs_get_lun_number { sub zfs_list_zvol { my ($scfg) = @_; - my $text = zfs_request($scfg, 10, 'list', '-o', 'name,volsize,origin', '-Hr'); + my $text = zfs_request($scfg, 10, 'list', '-o', 'name,volsize,origin', '-t', 'volume', '-Hr'); my $zvols = zfs_parse_zvol_list($text); return undef if !$zvols; @@ -279,8 +278,8 @@ sub zfs_list_zvol { foreach my $zvol (@$zvols) { my @values = split('/', $zvol->{name}); - my $pool = $values[0]; - my $image = $values[1]; + my $image = pop @values; + my $pool = join('/', @values); next if $image !~ m/^((vm|base)-(\d+)-\S+)$/; my $owner = $3;