Re: [PATCH 7/9] btrfs: make btrfs_submit_compressed_read() to determine stripe boundary at bio allocation time
From: Johannes Thumshirn <hidden>
Date: 2021-06-11 07:42:58
From: Johannes Thumshirn <hidden>
Date: 2021-06-11 07:42:58
On 11/06/2021 03:32, Qu Wenruo wrote:
@@ -443,7 +449,6 @@ static struct bio *alloc_compressed_bio(struct compressed_bio *cb, u64 disk_byte bio->bi_end_io = endio_func; if (bio_op(bio) == REQ_OP_ZONE_APPEND) { - struct btrfs_fs_info *fs_info = btrfs_sb(cb->inode->i_sb); struct btrfs_device *device; device = btrfs_zoned_get_device(fs_info, disk_bytenr,@@ -454,6 +459,15 @@ static struct bio *alloc_compressed_bio(struct compressed_bio *cb, u64 disk_byte } bio_set_dev(bio, device->bdev); } + em = btrfs_get_chunk_map(fs_info, disk_bytenr, fs_info->sectorsize); + if (IS_ERR(em)) + return ERR_CAST(em); + ret = btrfs_get_io_geometry(fs_info, em, btrfs_op(bio), disk_bytenr, + &geom); + free_extent_map(em); + if (ret < 0) + return ERR_PTR(ret); + *next_stripe_start = disk_bytenr + geom.len; return bio; }
If you're doing a chunk map lookup on allocation you can kill above btrfs_zoned_get_device() call and grab the block device for bio_set_dev() directly from the 1st stripe. Otherwise we're doing two chunk map lookups for zoned btrfs after another, which is inefficient.