From 3881e68025e228023bb8080fd456114888041f8f Mon Sep 17 00:00:00 2001 From: Aaron Lauterer Date: Tue, 7 Apr 2020 14:25:36 +0200 Subject: [PATCH] ZFS: use -p flag and remove zfs_parse_size ZFS supports the -p flag in the list command since a few years now. Let us use the real byte values and avoid the error prone calculation from human readable numbers that can lead to incorrect numbers if the reported human readable value is a rounded number. Signed-off-by: Aaron Lauterer --- PVE/Storage.pm | 6 +++--- PVE/Storage/ZFSPoolPlugin.pm | 40 ++---------------------------------- 2 files changed, 5 insertions(+), 41 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 4863d84..c381394 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -1210,7 +1210,7 @@ sub scan_cifs { sub scan_zfs { - my $cmd = ['zfs', 'list', '-t', 'filesystem', '-H', '-o', 'name,avail,used']; + my $cmd = ['zfs', 'list', '-t', 'filesystem', '-Hp', '-o', 'name,avail,used']; my $res = []; run_command($cmd, outfunc => sub { @@ -1218,8 +1218,8 @@ sub scan_zfs { if ($line =~m/^(\S+)\s+(\S+)\s+(\S+)$/) { my ($pool, $size_str, $used_str) = ($1, $2, $3); - my $size = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($size_str); - my $used = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($used_str); + my $size = $size_str + 0; + my $used = $used_str + 0; # ignore subvolumes generated by our ZFSPoolPlugin return if $pool =~ m!/subvol-\d+-[^/]+$!; return if $pool =~ m!/basevol-\d+-[^/]+$!; diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index 7da9e78..3808ab7 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -54,42 +54,6 @@ sub options { # static zfs helper methods -sub zfs_parse_size { - my ($text) = @_; - - return 0 if !$text; - - if ($text =~ m/^(\d+(\.\d+)?)([TGMK])?$/) { - - my ($size, $reminder, $unit) = ($1, $2, $3); - - if ($unit) { - if ($unit eq 'K') { - $size *= 1024; - } elsif ($unit eq 'M') { - $size *= 1024*1024; - } elsif ($unit eq 'G') { - $size *= 1024*1024*1024; - } elsif ($unit eq 'T') { - $size *= 1024*1024*1024*1024; - } else { - die "got unknown zfs size unit '$unit'\n"; - } - } - - if ($reminder) { - $size = ceil($size); - } - - return $size + 0; - - } - - warn "unable to parse zfs size '$text'\n"; - - return 0; -} - sub zfs_parse_zvol_list { my ($text) = @_; @@ -117,11 +81,11 @@ sub zfs_parse_zvol_list { if ($refquota eq 'none') { $zvol->{size} = 0; } else { - $zvol->{size} = zfs_parse_size($refquota); + $zvol->{size} = $refquota + 0; } $zvol->{format} = 'subvol'; } else { - $zvol->{size} = zfs_parse_size($size); + $zvol->{size} = $size + 0; $zvol->{format} = 'raw'; } if ($origin !~ /^-$/) {