[pve-devel] [PATCH storage 2/3] ZFS: use -p flag and remove zfs_parse_size

Aaron Lauterer a.lauterer at proxmox.com
Tue Apr 7 14:25:36 CEST 2020


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 <a.lauterer at proxmox.com>
---
 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 60b8310..7271463 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -1158,7 +1158,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 {
@@ -1166,8 +1166,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 cb3f2f0..ad2fe9b 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 !~ /^-$/) {
-- 
2.20.1





More information about the pve-devel mailing list