git: 97318fde948f - stable/12 - loader: zfs_probe_dev should pick first matching zfs pool

From: Kyle Evans <kevans_at_FreeBSD.org>
Date: Fri, 08 Oct 2021 06:11:08 UTC
The branch stable/12 has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=97318fde948f1e543e7df2c1034b84cd96dafcf1

commit 97318fde948f1e543e7df2c1034b84cd96dafcf1
Author:     Toomas Soome <tsoome@FreeBSD.org>
AuthorDate: 2020-09-23 08:22:14 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2021-10-08 05:24:27 +0000

    loader: zfs_probe_dev should pick first matching zfs pool
    
    During devswitch probe, we pick boot pool based on boot disk, if the boot
    disk happens to have multiple pools in freebsd-zfs partitions, the current
    code does pick last pool from boot disk as boot pool. While there is no
    way at that stage to test, the more logical approach would be to pick
    first matching pool.
    
    This patch is assuming we do pass pool guid pointer with guid value 0,
    this will help us to determine, if the guid value is already set or not.
    
    The general suggestion would be not to share disk between different pools.
    
    (cherry picked from commit 867ae3c38d1aa97300bd35f457037b3f1a0a103f)
---
 stand/efi/libefi/efizfs.c | 3 ++-
 stand/libsa/zfs/zfs.c     | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/stand/efi/libefi/efizfs.c b/stand/efi/libefi/efizfs.c
index aedb9c2294cd..7f3986d47140 100644
--- a/stand/efi/libefi/efizfs.c
+++ b/stand/efi/libefi/efizfs.c
@@ -99,7 +99,7 @@ efi_zfs_probe(void)
 	pdinfo_list_t *hdi;
 	pdinfo_t *hd, *pd = NULL;
 	char devname[SPECNAMELEN + 1];
-        uint64_t guid;
+	uint64_t guid;
 
 	hdi = efiblk_get_pdinfo_list(&efipart_hddev);
 	STAILQ_INIT(&zfsinfo);
@@ -114,6 +114,7 @@ efi_zfs_probe(void)
 		STAILQ_FOREACH(pd, &hd->pd_part, pd_link) {
 			snprintf(devname, sizeof(devname), "%s%dp%d:",
 			    efipart_hddev.dv_name, hd->pd_unit, pd->pd_unit);
+			guid = 0;
 			if (zfs_probe_dev(devname, &guid) == 0) {
 				insert_zfs(pd->pd_handle, guid);
 				if (pd->pd_handle == boot_img->DeviceHandle)
diff --git a/stand/libsa/zfs/zfs.c b/stand/libsa/zfs/zfs.c
index fd7b6cbfdeba..edf74170491b 100644
--- a/stand/libsa/zfs/zfs.c
+++ b/stand/libsa/zfs/zfs.c
@@ -745,7 +745,8 @@ zfs_probe(int fd, uint64_t *pool_guid)
 	spa = NULL;
 	ret = vdev_probe(vdev_read, (void *)(uintptr_t)fd, &spa);
 	if (ret == 0 && pool_guid != NULL)
-		*pool_guid = spa->spa_guid;
+		if (*pool_guid == 0)
+			*pool_guid = spa->spa_guid;
 	return (ret);
 }