]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Sort by full path name instead of by GUID when importing
authorkpande <github@tripleback.net>
Tue, 26 Feb 2019 19:13:15 +0000 (11:13 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 26 Feb 2019 19:13:15 +0000 (11:13 -0800)
Preferentially sort by the full path name instead of GUID when determining
which device links to use.  This helps ensure that the pool vdevs are named
consistently when multiple links for a device appear in the same directory.
For example, the /dev/disk/by-id/scsi* and /dev/disk/by-id/wwn* links.

Reviewed-by: Alek Pinchuk <apinchuk@datto.com>
Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com>
Authored-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Kash Pande <kash@tripleback.net>
Closes #8108
Closes #8440

lib/libzutil/zutil_import.c

index 4284efa757facb2ef5841c5abd6232fc2eaab55c..e82744383dc0f9638b305fe26d1343700b721125 100644 (file)
@@ -1458,7 +1458,7 @@ typedef struct rdsk_node {
 } rdsk_node_t;
 
 /*
- * Sorted by vdev guid and full path to allow for multiple entries with
+ * Sorted by full path and then vdev guid to allow for multiple entries with
  * the same full path name.  This is required because it's possible to
  * have multiple block devices with labels that refer to the same
  * ZPOOL_CONFIG_PATH yet have different vdev guids.  In this case both
@@ -1475,11 +1475,11 @@ slice_cache_compare(const void *arg1, const void *arg2)
        uint64_t guid2 = ((rdsk_node_t *)arg2)->rn_vdev_guid;
        int rv;
 
-       rv = AVL_CMP(guid1, guid2);
+       rv = AVL_ISIGN(strcmp(nm1, nm2));
        if (rv)
                return (rv);
 
-       return (AVL_ISIGN(strcmp(nm1, nm2)));
+       return (AVL_CMP(guid1, guid2));
 }
 
 static boolean_t