On Thu, Sep 01, 2022 at 04:54:32PM +0800, Qu Wenruo wrote: > I found the queue_limits structure pretty scary, while we only have very > limited members used in this case: > > - lim->virt_boundary_mask > Used in bvec_gap_to_prev() > > - lim->max_segments > > - lim->seg_boundary_mask > - lim->max_segment_size > Used in bvec_split_segs() > > - lim->logical_block_size > > Not familiar with block layer, thus I'm wondering do btrfs really need a > full queue_limits structure to call bio_split_rw(). Well, the queue limits is what the block layer uses for communicating the I/O size limitations, and thus both bio_split_rw and the stacking layer helpers operate on it. > Or can we have a simplified wrapper? I don't think we can simplify anything here. The alternative would be to open code the I/O path logic, which means a lot more code that needs to be maintained and has a high probability to get out of sync with the block layer logic. So I'd much rather share this code between everything that stacks block devices, be that to represent another block device on the top like dm/md or for a 'direct' stacking in the file system like btrfs does. > IIRC inside btrfs we only need two cases for bio split: > > - Split for stripe boundary > > - Split for OE/zoned boundary No. For zoned devices we all limitations for bio, basically all that you mentioned above.