add BIO_NORETRY flag, implement support in ata_da, use in ZFS vdev_geom

Andriy Gapon avg at
Tue Dec 12 16:20:13 UTC 2017

On 25/11/2017 12:54, Scott Long wrote:
> Why is overloading EIO so bad?  brelse() will call bdirty() when a BIO_WRITE
> command has failed with EIO.  Calling bdirty() has the effect of retrying the I/O.
> This disregards the fact that disk drivers only return EIO when they’ve decided
> that the I/O cannot be retried.  It has no termination condition for the retries, and
> will endlessly retry I/O in vain; I’ve seen this quite frequently.  It also disregards
> the fact that I/O marked as B_PAGING can’t be retried in this fashion, and will
> trigger a panic.  Because we pretend that EIO can be retried, we are left with
> a system that is very fragile when I/O actually does fail.  Instead of adding
> more special cases and blurred lines, I want to go back to enforcing strict
> contracts between the layers and force the core parts of the system to respect
> those contracts and handle errors properly, instead of just retrying and
> hoping for the best.

I agree with your intention.
But let's not project what I consider to be a bug in the buffer cache code on
all consumers of bio / geom interface.
In fact, I am much surprised that there is any code that treats EIO as
retriable.  I don't know of any other such code except for specialized disk
recovery tools.

Andriy Gapon

More information about the freebsd-fs mailing list