To replicate the issue, it will help to construct a bit extreme layout
of the partitioning. What I did was following:
1. Allocate most of the disk from start for zpool.
2. Allocate relatively small partition after the pool.
Populate the /boot directory to the pool and verify the loader will start.
Now copy copy some data to the pool, to trigger the rootbp updates, the
dataset create is needed as well, so we could hope we get the rootbp
pointing far enough.
Confirm the boot loader will fail to read the pool, resulting with
MOS read errors.
The better proof can be achieved by printing out the disk/partition
size we get from disk_ioctl in biosdisk.c - so it can be verified that
indeed, in case of the shared open disk info, the wrong size is used,
namely, the size of the last partition of the particular disk.
Since the fix is removing the shared info, every open device will get
its private instance and the problem is gone.