On Tue, Jul 31, 2007 at 12:17:59PM +1000, NeilBrown wrote:
This is pretty confusing. In all other places, bi_size -> #sector
conversion is done by rounding down but only in blk_rq_bio_prep() it's
being rounded up.
Is my following reasoning correct?
It was okay till now because unaligned requests don't get merged and
also haven't done partial completions (end_that_request_first with
partial count)? So till now, hard_nr_sectors and nr_sectors didn't
really matter for unaligned requests but now it matters because it's
considered while iterating over bvecs in rq.
If so, I think the correct thing to do would be changing bio_sectors()
to round up first or let block layer measure transfer in bytes not in
sectors. I don't think everyone would agree with the latter tho. I
(tentatively) think it would be better to represent length in bytes
tho. A lot of requests which aren't aligned to 512 bytes pass through
the block layer and the mismatch can result in subtle bugs.
Thanks.
--
tejun
-