]> git.proxmox.com Git - pve-storage.git/blobdiff - PVE/Diskmanage.pm
Fix #2020: use /sys to map nvmeXnY to nvmeX
[pve-storage.git] / PVE / Diskmanage.pm
index 5a5fc87799fc767406fadac086391352d39c2b4a..854f0a5bfa43bb84153197c52abaae31c17c3597 100644 (file)
@@ -79,8 +79,11 @@ sub get_smart_data {
 
     my $returncode = 0;
 
-    $disk =~ s/n\d+$//
-        if $disk =~ m!^/dev/nvme\d+n\d+$!;
+    if ($disk =~ m!^/dev/(nvme\d+n\d+)$!) {
+       my $info = get_sysdir_info("/sys/block/$1");
+       $disk = "/dev/".($info->{device}
+           or die "failed to get nvme controller device for $disk\n");
+    }
 
     my $cmd = [$SMARTCTL, '-H'];
     push @$cmd, '-A', '-f', 'brief' if !$healthonly;
@@ -306,6 +309,11 @@ sub get_sysdir_info {
     $data->{vendor} = file_read_firstline("$sysdir/device/vendor") || 'unknown';
     $data->{model} = file_read_firstline("$sysdir/device/model") || 'unknown';
 
+    if (defined(my $device = readlink("$sysdir/device"))) {
+       # strip directory and untaint:
+       ($data->{device}) = $device =~ m!([^/]+)$!;
+    }
+
     return $data;
 }
 
@@ -602,10 +610,10 @@ sub locked_disk_action {
     return $res;
 }
 
-sub check_unused {
+sub assert_disk_unused {
     my ($dev) = @_;
 
-    die "device $dev is already in use\n" if disk_is_used($dev);
+    die "device '$dev' is already in use\n" if disk_is_used($dev);
 
     return undef;
 }