]> git.proxmox.com Git - pve-storage.git/commitdiff
fix #2777 create zpools with stable dev paths
authorStoiko Ivanov <s.ivanov@proxmox.com>
Fri, 5 Jun 2020 13:24:56 +0000 (15:24 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 6 Jun 2020 17:32:33 +0000 (19:32 +0200)
when compiling the disk list add a property with a stable
/dev/disk/by-id/ path for a block device when available.

This is needed to create zpools with the stable by-id links

The /dev/disk/by-id/ directory can contain multiple links to the same device
(e.g. when it's used as a LVM PV, or one for the wwn/nvme-eui in addition
to the one with vendor and serial). We take the first one which matches
the bus where the disk is attached. For nvme disks we exclude the one
containing the nvme-eui.

The patch assumes that not all disks need to have such a link (e.g.
virtio-block devices as we pass them to guests).

Additionally the tests were adapted to run successfully.

Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
PVE/API2/Disks/ZFS.pm
PVE/Diskmanage.pm
test/disk_tests/sas/disklist_expected.json

index 551f21a3e3a9ebaeb497ac5a8ee2bac3bb64ce65..7a633a7cced967dd7b38605aa34254c79aadc772 100644 (file)
@@ -343,6 +343,9 @@ __PACKAGE__->register_method ({
        foreach my $dev (@$devs) {
            $dev = PVE::Diskmanage::verify_blockdev_path($dev);
            PVE::Diskmanage::assert_disk_unused($dev);
+           my $sysfsdev = $dev =~ s!^/dev/!/sys/block/!r;
+           my $udevinfo = PVE::Diskmanage::get_udev_info($sysfsdev);
+           $dev = $udevinfo->{by_id_link} if defined($udevinfo->{by_id_link});
        }
 
        PVE::Storage::assert_sid_unused($name) if $param->{add_storage};
index cac944d46ca81e121fc6b8567e946770a8aa24bd..267da081fc51c350cf01b93ae163a51dbd0e7d2c 100644 (file)
@@ -359,6 +359,11 @@ sub get_udev_info {
        $data->{wwn} = $1;
     }
 
+    if ($info =~ m/^E: DEVLINKS=(.+)$/m) {
+       my @devlinks = grep(m#^/dev/disk/by-id/(ata|scsi|nvme(?!-eui))#, split (/ /, $1));
+       $data->{by_id_link} = $devlinks[0] if defined($devlinks[0]);
+    }
+
     return $data;
 }
 
@@ -584,6 +589,9 @@ sub get_disks {
            wearout => $wearout,
        };
 
+       my $by_id_link = $data->{by_id_link};
+       $disklist->{$dev}->{by_id_link} = $by_id_link if defined($by_id_link);
+
        my $osdid = -1;
        my $bluestore = 0;
        my $osdencrypted = 0;
index 78147655508ee827295da60023bc91039589be4f..39b14a5bbac713dab2798b1b98b1e5dd4242ccae 100644 (file)
@@ -11,6 +11,7 @@
        "rpm" : -1,
        "size" : 5120000,
        "serial" : "SER2",
-       "wearout" : "N/A"
+       "wearout" : "N/A",
+       "by_id_link" : "/dev/disk/by-id/scsi-00000000000000000"
     }
 }