• Christoph Hellwig's avatar
    btrfs: handle checksum validation and repair at the storage layer · 7609afac
    Christoph Hellwig authored
    Currently btrfs handles checksum validation and repair in the end I/O
    handler for the btrfs_bio.  This leads to a lot of duplicate code
    plus issues with varying semantics or bugs, e.g.
    
    - the until recently broken repair for compressed extents
    - the fact that encoded reads validate the checksums but do not kick
      of read repair
    - the inconsistent checking of the BTRFS_FS_STATE_NO_CSUMS flag
    
    This commit revamps the checksum validation and repair code to instead
    work below the btrfs_submit_bio interfaces.
    
    In case of a checksum failure (or a plain old I/O error), the repair
    is now kicked off before the upper level ->end_io handler is invoked.
    
    Progress of an in-progress repair is tracked by a small structure
    that is allocated using a mempool for each original bio with failed
    sectors, which holds a reference to the original bio.   This new
    structure is allocated using a mempool to guarantee forward progress
    even under memory pressure.  The mempool will be replenished when
    the repair completes, just as the mempools backing the bios.
    
    There is one significant behavior change here:  If repair fails or
    is impossible to start with, the whole bio will be failed to the
    upper layer.  This is the behavior that all I/O submitters except
    for buffered I/O already emulated in their end_io handler.  For
    buffered I/O this now means that a large readahead request can
    fail due to a single bad sector, but as readahead errors are ignored
    the following readpage if the sector is actually accessed will
    still be able to read.  This also matches the I/O failure handling
    in other file systems.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    7609afac
inode.c 323 KB