Date: Tue, 3 May 2016 00:09:13 +0000 (UTC) From: Peter Wemm <peter@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r298949 - head/sys/boot/i386/zfsboot Message-ID: <201605030009.u4309Dea097646@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605030009.u4309Dea097646>