• David Jeffery's avatar
    xfs: return errors from partial I/O failures to files · ff8c37e6
    David Jeffery authored
    commit c9eb256e upstream.
    
    There is an issue with xfs's error reporting in some cases of I/O partially
    failing and partially succeeding. Calls like fsync() can report success even
    though not all I/O was successful in partial-failure cases such as one disk of
    a RAID0 array being offline.
    
    The issue can occur when there are more than one bio per xfs_ioend struct.
    Each call to xfs_end_bio() for a bio completing will write a value to
    ioend->io_error.  If a successful bio completes after any failed bio, no
    error is reported do to it writing 0 over the error code set by any failed bio.
    The I/O error information is now lost and when the ioend is completed
    only success is reported back up the filesystem stack.
    
    xfs_end_bio() should only set ioend->io_error in the case of BIO_UPTODATE
    being clear.  ioend->io_error is initialized to 0 at allocation so only needs
    to be updated by a failed bio. Also check that ioend->io_error is 0 so that
    the first error reported will be the error code returned.
    Signed-off-by: default avatarDavid Jeffery <djeffery@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    [bwh: Backported to 3.2: adjust context]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    ff8c37e6
xfs_aops.c 35.4 KB