Message ID | 20220517145039.3202184-12-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/15] btrfs: introduce a pure data checksum checking helper | expand |
On 2022/5/17 22:50, Christoph Hellwig wrote: > The new repair code expects ->file_offset to be set for all bios. Set > it just after entering end_bio_extent_readpage. As that requires looking > at the first vector before the first loop iteration also use that > opportunity to set various file-wide variables just once instead of once > per loop iteration. > > Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu > --- > fs/btrfs/extent_io.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c > index 1ba2d4b194f2e..cbe3ab24af9e5 100644 > --- a/fs/btrfs/extent_io.c > +++ b/fs/btrfs/extent_io.c > @@ -3018,25 +3018,30 @@ static struct extent_buffer *find_extent_buffer_readpage( > */ > static void end_bio_extent_readpage(struct bio *bio) > { > + struct bio_vec *first_vec = bio_first_bvec_all(bio); > + struct inode *inode = first_vec->bv_page->mapping->host; > + struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); > + const u32 sectorsize = fs_info->sectorsize; > struct bio_vec *bvec; > struct btrfs_bio *bbio = btrfs_bio(bio); > - struct extent_io_tree *tree, *failure_tree; > + int mirror = bbio->mirror_num; > + struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; > + struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree; > + bool uptodate = !bio->bi_status; > struct processed_extent processed = { 0 }; > /* > * The offset to the beginning of a bio, since one bio can never be > * larger than UINT_MAX, u32 here is enough. > */ > u32 bio_offset = 0; > - int mirror; > struct bvec_iter_all iter_all; > > + btrfs_bio(bio)->file_offset = > + page_offset(first_vec->bv_page) + first_vec->bv_offset; > + > ASSERT(!bio_flagged(bio, BIO_CLONED)); > bio_for_each_segment_all(bvec, bio, iter_all) { > - bool uptodate = !bio->bi_status; > struct page *page = bvec->bv_page; > - struct inode *inode = page->mapping->host; > - struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); > - const u32 sectorsize = fs_info->sectorsize; > unsigned int error_bitmap = (unsigned int)-1; > bool repair = false; > u64 start; > @@ -3046,9 +3051,7 @@ static void end_bio_extent_readpage(struct bio *bio) > btrfs_debug(fs_info, > "end_bio_extent_readpage: bi_sector=%llu, err=%d, mirror=%u", > bio->bi_iter.bi_sector, bio->bi_status, > - bbio->mirror_num); > - tree = &BTRFS_I(inode)->io_tree; > - failure_tree = &BTRFS_I(inode)->io_failure_tree; > + mirror); > > /* > * We always issue full-sector reads, but if some block in a > @@ -3071,7 +3074,6 @@ static void end_bio_extent_readpage(struct bio *bio) > end = start + bvec->bv_len - 1; > len = bvec->bv_len; > > - mirror = bbio->mirror_num; > if (likely(uptodate)) { > if (is_data_inode(inode)) { > error_bitmap = btrfs_verify_data_csum(bbio,
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 1ba2d4b194f2e..cbe3ab24af9e5 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3018,25 +3018,30 @@ static struct extent_buffer *find_extent_buffer_readpage( */ static void end_bio_extent_readpage(struct bio *bio) { + struct bio_vec *first_vec = bio_first_bvec_all(bio); + struct inode *inode = first_vec->bv_page->mapping->host; + struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); + const u32 sectorsize = fs_info->sectorsize; struct bio_vec *bvec; struct btrfs_bio *bbio = btrfs_bio(bio); - struct extent_io_tree *tree, *failure_tree; + int mirror = bbio->mirror_num; + struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; + struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree; + bool uptodate = !bio->bi_status; struct processed_extent processed = { 0 }; /* * The offset to the beginning of a bio, since one bio can never be * larger than UINT_MAX, u32 here is enough. */ u32 bio_offset = 0; - int mirror; struct bvec_iter_all iter_all; + btrfs_bio(bio)->file_offset = + page_offset(first_vec->bv_page) + first_vec->bv_offset; + ASSERT(!bio_flagged(bio, BIO_CLONED)); bio_for_each_segment_all(bvec, bio, iter_all) { - bool uptodate = !bio->bi_status; struct page *page = bvec->bv_page; - struct inode *inode = page->mapping->host; - struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); - const u32 sectorsize = fs_info->sectorsize; unsigned int error_bitmap = (unsigned int)-1; bool repair = false; u64 start; @@ -3046,9 +3051,7 @@ static void end_bio_extent_readpage(struct bio *bio) btrfs_debug(fs_info, "end_bio_extent_readpage: bi_sector=%llu, err=%d, mirror=%u", bio->bi_iter.bi_sector, bio->bi_status, - bbio->mirror_num); - tree = &BTRFS_I(inode)->io_tree; - failure_tree = &BTRFS_I(inode)->io_failure_tree; + mirror); /* * We always issue full-sector reads, but if some block in a @@ -3071,7 +3074,6 @@ static void end_bio_extent_readpage(struct bio *bio) end = start + bvec->bv_len - 1; len = bvec->bv_len; - mirror = bbio->mirror_num; if (likely(uptodate)) { if (is_data_inode(inode)) { error_bitmap = btrfs_verify_data_csum(bbio,
The new repair code expects ->file_offset to be set for all bios. Set it just after entering end_bio_extent_readpage. As that requires looking at the first vector before the first loop iteration also use that opportunity to set various file-wide variables just once instead of once per loop iteration. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/btrfs/extent_io.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)