On Tue, Jun 15, 2021 at 03:22:59PM +0800, Qu Wenruo wrote: > Hi, > > Recently I got a strange case where for write bio, at its endio time, I got > bio->bi_iter.bi_size == 0, but bio_for_each_segment_all() reports we still > have some bv_len. It is normal to observe zero .bi_size in ->bi_end_io(), see req_bio_endio(). Meantime bio_for_each_segment_all() covers all pages added to the bio via bio_add_page(), which is invariant after the bio is submitted. > > And obviously, when the bio get submitted, its bi_size is not 0. > > This is especially common for REQ_OP_ZONE_APPEND bio, but I also get rare > bi_size == 0 at endio time, for REQ_OP_WRITE too. It shouldn't be rare. > > So I guess bi_size at endio time is no longer reliable due to bio > merging/splitting? No, ->bi_size should be zero in .bi_end_io() if this bio is completed successfully no matter if the bio is splitted or not. > > Thus the only correct way to get how large a bio really is, is through > bio_for_each_segment_all()? Yeah, if you mean to get the bio's real size in ->bi_end_io(). Thanks, Ming