Btrfs: change how we iterate bios in endio
authorLiu Bo <bo.li.liu@oracle.com>
Mon, 15 May 2017 22:33:27 +0000 (15:33 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2017 16:25:59 +0000 (18:25 +0200)
commit17347cec15f919901c90cdbf98af47ed2ed28b9f
tree27fa6d42856840f59bf9cc1cb042ee234a355cf1
parent725130bac5857ac035cf9f47d2973ee4e734db54
Btrfs: change how we iterate bios in endio

Since dio submit has used bio_clone_fast, the submitted bio may not have a
reliable bi_vcnt, for the bio vector iterations in checksum related
functions, bio->bi_iter is not modified yet and it's safe to use
bio_for_each_segment, while for those bio vector iterations in dio read's
endio, we now save a copy of bvec_iter in struct btrfs_io_bio when cloning
bios and use the helper __bio_for_each_segment with the saved bvec_iter to
access each bvec.

Also for dio reads which don't get split, we also need to save a copy of
bio iterator in btrfs_bio_clone to let __bio_for_each_segments to access
each bvec in dio read's endio.  Note that it doesn't affect other calls of
btrfs_bio_clone() because they don't need to use this iterator.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c
fs/btrfs/file-item.c
fs/btrfs/inode.c
fs/btrfs/volumes.h