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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to