svn commit: r298949 - head/sys/boot/i386/zfsboot
Peter Wemm
peter at FreeBSD.org
Tue May 3 00:09:14 UTC 2016
Author: peter
Date: Tue May 3 00:09:13 2016
New Revision: 298949
URL: https://svnweb.freebsd.org/changeset/base/298949
Log:
Change a rounding operation that had missing braces into a roundup2()
macro. Adjust the buffer clipping code to work as expected.
This prevented a number of machines in the FreeBSD.org cluster from
booting due to "ZFS: i/o error - all block copies unavailable"
after an unclean shutdown.
Modified:
head/sys/boot/i386/zfsboot/zfsboot.c
Modified: head/sys/boot/i386/zfsboot/zfsboot.c
==============================================================================
--- head/sys/boot/i386/zfsboot/zfsboot.c Mon May 2 22:58:11 2016 (r298948)
+++ head/sys/boot/i386/zfsboot/zfsboot.c Tue May 3 00:09:13 2016 (r298949)
@@ -224,21 +224,18 @@ vdev_read(vdev_t *vdev, void *priv, off_
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;
More information about the svn-src-all
mailing list