• Filipe Manana's avatar
    Btrfs: add missing check for writeback errors on fsync · 0596a904
    Filipe Manana authored
    When we start an fsync we start ordered extents for all delalloc ranges.
    However before attempting to log the inode, we only wait for those ordered
    extents if we are not doing a full sync (bit BTRFS_INODE_NEEDS_FULL_SYNC
    is set in the inode's flags). This means that if an ordered extent
    completes with an IO error before we check if we can skip logging the
    inode, we will not catch and report the IO error to user space. This is
    because on an IO error, when the ordered extent completes we do not
    update the inode, so if the inode was not previously updated by the
    current transaction we end up not logging it through calls to fsync and
    therefore not check its mapping flags for the presence of IO errors.
    
    Fix this by checking for errors in the flags of the inode's mapping when
    we notice we can skip logging the inode.
    
    This caused sporadic failures in the test generic/331 (which explicitly
    tests for IO errors during an fsync call).
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    0596a904
file.c 80.6 KB