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.

Reported by:	Alexander Leidinger
This commit is contained in:
tsoome 2020-09-23 08:22:14 +00:00
parent 667eef4ac6
commit 34342655e6
2 changed files with 4 additions and 2 deletions

View File

@ -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)

View File

@ -651,7 +651,8 @@ zfs_probe(int fd, uint64_t *pool_guid)
spa = NULL;
ret = vdev_probe(vdev_read, vdev_write, (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);
}