aboutsummaryrefslogtreecommitdiff
path: root/sys/boot/i386
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>2016-05-03 00:09:13 +0000
committerPeter Wemm <peter@FreeBSD.org>2016-05-03 00:09:13 +0000
commitd8818fce6968e3cf42b017d47a23000bfb0cf906 (patch)
tree06ecdd5acadf94c9c51ac9848008f9044c9d4552 /sys/boot/i386
parentd546e47aa0b57d0fe2370217df91aa5a921e6932 (diff)
Notes
Diffstat (limited to 'sys/boot/i386')
-rw-r--r--sys/boot/i386/zfsboot/zfsboot.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/sys/boot/i386/zfsboot/zfsboot.c b/sys/boot/i386/zfsboot/zfsboot.c
index 928e41ab6767..2562aab5b59f 100644
--- a/sys/boot/i386/zfsboot/zfsboot.c
+++ b/sys/boot/i386/zfsboot/zfsboot.c
@@ -224,21 +224,18 @@ vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes)
while (bytes > 0) {
nb = bytes / DEV_BSIZE;
- if (nb > READ_BUF_SIZE / DEV_BSIZE)
- nb = READ_BUF_SIZE / DEV_BSIZE;
/*
* Ensure that the read size plus the leading offset does not
* exceed the size of the read buffer.
*/
- if (nb * DEV_BSIZE + diff > READ_BUF_SIZE)
- nb -= diff / DEV_BSIZE;
+ if (nb > (READ_BUF_SIZE - diff) / DEV_BSIZE)
+ nb = (READ_BUF_SIZE - diff) / DEV_BSIZE;
/*
* Round the number of blocks to read up to the nearest multiple
* of DEV_GELIBOOT_BSIZE.
*/
- alignnb = nb + (diff / DEV_BSIZE) +
- (DEV_GELIBOOT_BSIZE / DEV_BSIZE - 1) & ~
- (unsigned int)(DEV_GELIBOOT_BSIZE / DEV_BSIZE - 1);
+ alignnb = roundup2(nb * DEV_BSIZE + diff, DEV_GELIBOOT_BSIZE)
+ / DEV_BSIZE;
if (drvread(dsk, dmadat->rdbuf, alignlba, alignnb))
return -1;