]> git.proxmox.com Git - mirror_zfs.git/commitdiff
vdev_id: Create symlinks even if no /dev/mapper/
authorTony Hutter <hutter2@llnl.gov>
Mon, 8 Mar 2021 16:43:30 +0000 (08:43 -0800)
committerGitHub <noreply@github.com>
Mon, 8 Mar 2021 16:43:30 +0000 (08:43 -0800)
vdev_id uses the /dev/mapper/ symlinks to resolve a UUID to a dm name
(like dm-1).  However on some multipath setups, there is no /dev/mapper/
entry for the UUID at the time vdev_id is called by udev.  However,
this isn't necessarily needed, as we may be able to resolve the dm
name from the $DEVNAME that udev passes us (like DEVNAME="/dev/dm-1").

This patch tries to resolve the dm name from $DEVNAME first, before
falling back to looking in /dev/mapper/.  This fixed an issue where the
by-vdev names weren't reliably showing up on one of our nodes.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
Closes #11698

cmd/vdev_id/vdev_id

index 8a379a72690e586e6df20700f62f11b5f225a167..d8918da1078cc9fd06f5e402b3f21d66e3c2efc4 100755 (executable)
@@ -298,8 +298,15 @@ sas_handler() {
 
                # Utilize DM device name to gather subordinate block devices
                # using sysfs to avoid userspace utilities
-               DMDEV=$(ls -l --full-time /dev/mapper | grep $DM_NAME |
+
+               # If our DEVNAME is something like /dev/dm-177, then we may be
+               # able to get our DMDEV from it.
+               DMDEV=$(echo $DEVNAME | sed 's;/dev/;;g')
+               if [ ! -e /sys/block/$DMDEV/slaves/* ] ; then
+                       # It's not there, try looking in /dev/mapper
+                       DMDEV=$(ls -l --full-time /dev/mapper | grep $DM_NAME |
                        awk '{gsub("../", " "); print $NF}')
+               fi
 
                # Use sysfs pointers in /sys/block/dm-X/slaves because using
                # userspace tools creates lots of overhead and should be avoided