mirror_zfs/config
Brian Behlendorf 0f62f3f9ab Disable GCCs aggressive loop optimization
GCC >+ 4.8's aggressive loop optimization breaks some of the iterators
over the dn_blkptr[] pseudo-array in dnode_phys. Since dn_blkptr[] is
defined as a single-element array, GCC believes an iterator can only
access index 0 and will unroll the loop into a single iteration.

One way to resolve the issue would be to cast the array to a pointer
and fix all the iterators that might break.  The only loop where it
is known to cause a problem is this loop in dmu_objset_write_ready():

    for (i = 0; i < dnp->dn_nblkptr; i++)
            bp->blk_fill += dnp->dn_blkptr[i].blk_fill;

In the common case where dn_nblkptr is 3, the loop is only executed a
single time and "i" is equal to 1 following the loop.

The specific breakage caused by this problem is that the blk_fill of
root block pointers wouldn't be set properly when more than one blkptr
is in use (when no indrect blocks are needed).

The simple reproducing sequence is:

zpool create tank /tank.img
zdb -ddddd tank 0

Notice that "fill=31", however, there are two L0 indirect blocks with
"F=31" and "F=5". The fill count should be 36 rather than 31. This
problem causes an assert to be hit in a simple "zdb tank" when built
with --enable-debug.

However, this approach was not taken because we need to be absolutely
sure we catch all instances of this unwanted optimization.  Therefore,
the build system has been updated to detect if GCC supports the
aggressive loop optimization.  If it does the optimization will be
explicitly disabled using the -fno-aggressive-loop-optimization option.

Original-fix-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2010
Closes #2051
2014-01-14 13:55:58 -08:00
..
.gitignore build: do not call boilerplate ourself 2013-04-02 10:55:20 -07:00
always-no-aggressive-loop-optimizations.m4 Disable GCCs aggressive loop optimization 2014-01-14 13:55:58 -08:00
always-no-unused-but-set-variable.m4 In autoconf v2.68, AC_LANG_PROGRAM must be quoted 2011-11-28 11:16:33 -08:00
config.awk Add build system 2010-08-31 13:41:27 -07:00
deb.am Add --bump=0 to alien 2013-04-24 16:18:53 -07:00
kernel-acl.m4 Posix ACL Support 2013-10-29 14:54:26 -07:00
kernel-automount.m4 Fix snapshot automounting with GrSecurity constify plugin. 2012-08-24 08:56:38 -07:00
kernel-bdev-block-device-operations.m4 3.10 API change: block_device_operations->release() returns void 2013-07-08 15:41:57 -07:00
kernel-bdev-logical-size.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-bdev-physical-size.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-bdi-setup-and-register.m4 Properly ignore bdi_setup_and_register return value 2013-12-04 14:53:45 -08:00
kernel-bdi.m4 Fix typos in commit b83e3e48c9 2013-11-20 15:24:39 -08:00
kernel-bio-end-io-t-args.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-bio-failfast.m4 Fix gcc configure warnings 2011-04-19 10:10:47 -07:00
kernel-bio-rw-syncio.m4 Fix gcc configure warnings 2011-04-19 10:10:47 -07:00
kernel-blk-end-request.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-fetch-request.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-discard.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-flush.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-io-opt.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-max-hw-sectors.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-max-segments.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-nonrot.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-queue-physical-block-size.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-requeue-request.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-rq-bytes.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-rq-pos.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blk-rq-sectors.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-blkdev-get-by-path.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-blkdev-get.m4 Move partition scanning from userspace to module. 2012-07-17 09:17:31 -07:00
kernel-block-device-operations-release-void.m4 3.10 API change: block_device_operations->release() returns void 2013-07-08 15:41:57 -07:00
kernel-check-disk-size-change.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-clear-inode.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-commit-metadata.m4 Implement .commit_metadata hook for NFS export 2012-10-03 10:49:45 -07:00
kernel-create-nameidata.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-d-make-root.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-d-obtain-alias.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-dentry-operations.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-dirty-inode.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-discard-granularity.m4 Set zvol discard_granularity to the volblocksize. 2012-08-07 14:55:31 -07:00
kernel-elevator-change.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-encode-fh-inode.m4 Linux 3.5 compat, eops->encode_fh() takes inodes 2012-07-23 12:29:23 -07:00
kernel-evict-inode.m4 Fix build failures on PaX/GRSecurity patched kernels 2012-07-17 09:22:43 -07:00
kernel-fallocate.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-fmode-t.m4 Fix gcc configure warnings 2011-04-19 10:10:47 -07:00
kernel-fsync.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-get-disk-ro.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-get-gendisk.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-insert-inode-locked.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-invalidate-bdev-args.m4 Fix gcc configure warnings 2011-04-19 10:10:47 -07:00
kernel-kobj-name-len.m4 Fix gcc configure warnings 2011-04-19 10:10:47 -07:00
kernel-lookup-bdev.m4 Linux 2.6.26 compat, lookup_bdev() 2013-01-28 15:35:00 -08:00
kernel-lookup-nameidata.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-lseek-execute.m4 Add SEEK_DATA/SEEK_HOLE to lseek()/llseek() 2013-07-02 09:24:43 -07:00
kernel-mkdir-umode-t.m4 Eliminate runtime function pointer mods in autotools checks 2013-03-04 08:49:17 -08:00
kernel-mount-nodev.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-open-bdev-exclusive.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-rq-for-each_segment.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-rq-is_sync.m4 Only use gcc -Wunused-but-set-variable when available 2013-01-10 16:09:39 -08:00
kernel-security-inode-init.m4 Use -Werror for all kernel configure tests. 2013-02-24 10:20:28 -08:00
kernel-set-nlink.m4 Linux 3.2 compat: set_nlink() 2011-12-16 20:02:52 -08:00
kernel-sget-args.m4 Linux 3.6 compat, sget() 2012-10-14 13:06:48 -07:00
kernel-show-options.m4 Fix NULL pointer dereference on PaX/GRSecurity patched Linux 3.3 and later kernels 2012-07-20 12:31:45 -07:00
kernel-shrink.m4 Fix arc_adapt() spinning in iterate_supers_type() 2013-07-17 09:28:06 -07:00
kernel-truncate-range.m4 Linux 3.5 compat, iops->truncate_range() removed 2012-07-23 12:29:32 -07:00
kernel-truncate-setsize.m4 When checking for symbol exports, try compiling. 2012-07-26 13:42:57 -07:00
kernel-vfs-iterate.m4 Linux 3.11 compat: fops->iterate() 2013-08-15 16:19:07 -07:00
kernel-xattr-handler.m4 Posix ACL Support 2013-10-29 14:54:26 -07:00
kernel.m4 Disable GCCs aggressive loop optimization 2014-01-14 13:55:58 -08:00
rpm.am Refresh RPM packaging 2013-03-18 15:33:17 -07:00
Rules.am Disable GCCs aggressive loop optimization 2014-01-14 13:55:58 -08:00
suppressed-warnings.txt Suppress packaging warning 2011-11-08 11:32:04 -08:00
tgz.am Refresh RPM packaging 2013-03-18 15:33:17 -07:00
user-arch.m4 Add build system 2010-08-31 13:41:27 -07:00
user-dracut.m4 Add --with-dracutdir configure option 2013-03-06 15:46:41 -08:00
user-frame-larger-than.m4 In autoconf v2.68, AC_LANG_PROGRAM must be quoted 2011-11-28 11:16:33 -08:00
user-ioctl.m4 Add build system 2010-08-31 13:41:27 -07:00
user-libblkid.m4 Fix libblkid support 2013-10-10 16:56:51 -07:00
user-libuuid.m4 Add build system 2010-08-31 13:41:27 -07:00
user-udev.m4 Move udev rules from /etc/udev to /lib/udev 2011-08-08 16:21:10 -07:00
user-zlib.m4 Add build system 2010-08-31 13:41:27 -07:00
user.m4 Add full SELinux support 2013-12-19 10:37:31 -08:00
zfs-build.m4 Disable GCCs aggressive loop optimization 2014-01-14 13:55:58 -08:00
zfs-meta.m4 Support .nogitrelease file 2013-04-24 16:18:49 -07:00