I used to boot zfs on whole disk(s) from a USB stick with a GPT partition scheme and gptzfsboot on it since FreeBSD version 9 on many testing machines and even production servers without any problems. With the release 12 this feature is broken.
I found the reason in the source code: In the file /head/stand/i386/libi386/biosdisk.c a regression was introduced in the revisions base r37271, base r337317. Its about detecting the correct number of sectors/blocks for a block device. The change was introduced because a certain device (Mediasonic HD3-U2B PATA to USB enclosure) was not working. I tested various SASTA disks, even a 10TB disk, and USB Sticks, all detecting the wrong number of sectors instead. Reverting the change leaded to the correct detection of the number of sectors and therefore I was able to boot again. I tested also revision base r342785 of the file /head/stand/i386/libi386/biosdisk.c: The detection of the number of sectors is implemented the right way again and has improved of course.
I propose the following patch to fix the regression for FreeBSD 12
--- stand/i386/libi386/biosdisk.c (revision 343578)
+++ stand/i386/libi386/biosdisk.c (working copy)
@@ -270,8 +270,8 @@
total = (uint64_t)params.cylinders *
params.heads * params.sectors_per_track;
- if (total > 0 && bd->bd_sectors > total)
- bd->bd_sectors = total;
+ if (bd->bd_sectors < total)
+ bd->bd_sectors = total;
ret = 1;
Already fixed (with a different patch) by r339321
Sorry closed wrong bug by accident, r339321 is not related.
The problem there was that the device had actual size smaller than calculated and when there was an attempt to access the disk, the system did hung.
Anyhow, in your case, how the failure is manifesting? I mean, if you do have GPT on disk, the code should read the disk size from GPT and ignore the value from INT13 (see bd_disk_get_sectors() in biosdisk.c).