• I
    btrfs scrub: make fixups sync · 96e36920
    Ilya Dryomov 提交于
    btrfs scrub - make fixups sync, don't reuse fixup bios
    
    Fixups are already sync for csum failures, this patch makes them sync
    for EIO case as well.
    
    Fixups are now sharing pages with the parent sbio - instead of
    allocating a separate page to do a fixup we grab the page from the sbio
    buffer.
    
    Fixup bios are no longer reused.
    
    struct fixup is no longer needed, instead pass [sbio pointer, index].
    
    Originally this was added to look at the possibility of sharing the code
    between drive swap and scrub, but it actually fixes a serious bug in
    scrub code where errors that could be corrected were ignored and
    reported as uncorrectable.
    
    btrfs scrub - restore bios properly after media errors
    
    The current code reallocates a bio after a media error.  This is a
    temporary measure introduced in v3 after a serious problem related to
    bio reuse was found in v2 of scrub patchset.
    
    Basically we did not reset bv_offset and bv_len fields of the bio_vec
    structure.  They are changed in case I/O error happens, for example, at
    offset 512 or 1024 into the page.  Also bi_flags field wasn't properly
    setup before reusing the bio.
    Signed-off-by: NArne Jansen <sensille@gmx.net>
    96e36920
scrub.c 33.0 KB