btrfs scrub: make fixups sync
authorIlya Dryomov <idryomov@gmail.com>
Sat, 9 Apr 2011 11:27:01 +0000 (14:27 +0300)
committerArne Jansen <sensille@gmx.net>
Thu, 12 May 2011 12:48:28 +0000 (14:48 +0200)
commit96e369208e65a7d017a52361fd572df41fde8472
treeb72e4aafce997d87934a15f3b5594d8d162b1eef
parent475f63874d739d7842a56da94687f18d583ae654
btrfs scrub: make fixups sync

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: Arne Jansen <sensille@gmx.net>
fs/btrfs/scrub.c