• FUJITA Tomonori's avatar
    block: fix nr_phys_segments miscalculation bug · 86771427
    FUJITA Tomonori authored
    This fixes the bug reported by Nikanth Karthikesan <knikanth@suse.de>:
    The root cause of the bug is that blk_phys_contig_segment
    miscalculates q->max_segment_size.
    blk_phys_contig_segment checks:
    req->biotail->bi_size + next_req->bio->bi_size > q->max_segment_size
    But blk_recalc_rq_segments might expect that req->biotail and the
    previous bio in the req are supposed be merged into one
    segment. blk_recalc_rq_segments might also expect that next_req->bio
    and the next bio in the next_req are supposed be merged into one
    segment. In such case, we merge two requests that can't be merged
    here. Later, blk_rq_map_sg gives more segments than it should.
    We need to keep track of segment size in blk_recalc_rq_segments and
    use it to see if two requests can be merged. This patch implements it
    in the similar way that we used to do for hw merging (virtual
    Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
blk-merge.c 10.3 KB