From 6965a6701e4fa8591ba80c860d23c54aec21d58b Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Wed, 5 Oct 2016 10:57:10 +0200 Subject: [PATCH] fix #1135: refactor wear level parsing refactored the wear level parsing into its own function, where we can now define a vendor <-> attribute id mapping Signed-off-by: Dominik Csapak --- PVE/Diskmanage.pm | 53 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/PVE/Diskmanage.pm b/PVE/Diskmanage.pm index 4ee89ae..1befd9e 100644 --- a/PVE/Diskmanage.pm +++ b/PVE/Diskmanage.pm @@ -284,6 +284,44 @@ sub get_sysdir_info { return $data; } +sub get_wear_leveling_info { + my ($attributes, $model) = @_; + + my $wearout; + + my $vendormap = { + 'kingston' => 231, + 'samsung' => 177, + 'intel' => 233, + 'sandisk' => 233, + 'default' => 233, + }; + + # find target attr id + + my $attrid; + + foreach my $vendor (keys $vendormap) { + if ($model =~ m/$vendor/i) { + $attrid = $vendormap->{$vendor}; + # found the attribute + last; + } + } + + if (!$attrid) { + $attrid = $vendormap->{default}; + } + + foreach my $attr (@$attributes) { + next if $attr->{id} != $attrid; + $wearout = $attr->{value}; + last; + } + + return $wearout; +} + sub get_disks { my ($disk, $nosmart) = @_; my $disklist = {}; @@ -366,7 +404,7 @@ sub get_disks { } my $health = 'UNKNOWN'; - my $wearout; + my $wearout = 'N/A'; if (!$nosmart) { eval { @@ -375,17 +413,8 @@ sub get_disks { if ($type eq 'ssd') { # if we have an ssd we try to get the wearout indicator - $wearout = 'N/A'; - foreach my $attr (@{$smartdata->{attributes}}) { - # ID 233 is media wearout indicator on intel and sandisk - # ID 177 is media wearout indicator on samsung - next if ($attr->{id} != 233 && $attr->{id} != 177); - next if ($attr->{name} !~ m/wear/i); - $wearout = $attr->{value}; - - # prefer the 233 value - last if ($attr->{id} == 233); - } + my $wearval = get_wear_leveling_info($smartdata->{attributes}, $sysdata->{model}); + $wearout = $wearval if $wearval; } }; } -- 2.39.2