On Wed, May 25, 2022 at 08:08:07AM -0600, Keith Busch wrote: > On Tue, May 24, 2022 at 08:09:21AM +0200, Christoph Hellwig wrote: > > > bio_for_each_segment(from, *bio_orig, iter) { > > > if (i++ < BIO_MAX_VECS) > > > - sectors += from.bv_len >> 9; > > > + bytes += from.bv_len; > > > if (PageHighMem(from.bv_page)) > > > bounce = true; > > > } > > > if (!bounce) > > > return; > > > > > > + sectors = ALIGN_DOWN(bytes, queue_logical_block_size(q)) >> 9; > > > > Same comment about SECTOR_SHIFT and a comment here. That being said, > > why do we even align here? Shouldn't bytes always be setor aligned here > > and this should be a WARN_ON or other sanity check? Probably the same > > for the previous patch. > > Yes, the total bytes should be sector aligned. > > I'm not exactly sure why we're counting it this way, though. We could just skip > the iterative addition and get the total from bio->bi_iter.bi_size. Unless > bio_orig has more segments that BIO_MAX_VECS, which doesn't seem possible. Oh, there's a comment explaining the original can have more than BIO_MAX_VECS, so the ALIGN_DOWN is necessary to ensure a logical block sized split.