ZFS: i/o error - all block copies unavailable after upgrading to r225312

Andriy Gapon avg at FreeBSD.org
Sun Sep 11 08:32:01 UTC 2011


on 10/09/2011 14:03 Peter Jeremy said the following:
> On 2011-Sep-10 12:46:50 +0300, Andriy Gapon <avg at FreeBSD.org> wrote:
>> on 10/09/2011 11:07 Andriy Gapon said the following:
>>> Actually, removing either -mrtd _or_ -fno-unit-at-a-time produces the
>>> correct code.  Puzzled.
>> 
>> The problem is reproducible with base gcc and gcc42, it is not
>> reproducible with gcc45, gcc46 and clang.
> 
> I was just checking gcc44 & gcc46.  gcc44 inlines the entire function and I
> couldn't quickly find the offending code to see if the bug was there or
> not.  I agree you've triggered a gcc bug but I'm not sure of the correct
> approach to fix it.  I've tried a few trivial code transforms within
> vdev_read_phys() but haven't stumbled on one that avoids the problem.
> 
> Since -mrtd changes the calling convention, it's a more intrusive change.
> I'm not sure if there's any simple way to alter CFLAGS for a single file
> (since we only want to alter the zfsboot.c compilation.

And I am actually wondering about -fno-unit-at-a-time option.
In my opinion this is an anti-optimization option and it can actually increase
a size of a final binary.  In fact, it looks like the option was introduced to
boot2 in r132870 in the year 2004, way before GCC 4.X switch, and it was
introduced to avoid some optimizations that produced broken code.
I wonder if there is any reason to keep using that option now.

At least the zfs boot code works fine without the option in my testing.

-- 
Andriy Gapon


More information about the freebsd-current mailing list