• N
    block: Improvements to bounce-buffer handling · a8821f3f
    NeilBrown 提交于
    Since commit 23688bf4 ("block: ensure to split after potentially
    bouncing a bio") blk_queue_bounce() is called *before*
    blk_queue_split().
    This means that:
     1/ the comments blk_queue_split() about bounce buffers are
        irrelevant, and
     2/ a very large bio (more than BIO_MAX_PAGES) will no longer be
        split before it arrives at blk_queue_bounce(), leading to the
        possibility that bio_clone_bioset() will fail and a NULL
        will be dereferenced.
    
    Separately, blk_queue_bounce() shouldn't use fs_bio_set as the bio
    being copied could be from the same set, and this could lead to a
    deadlock.
    
    So:
     - allocate 2 private biosets for blk_queue_bounce, one for
       splitting enormous bios and one for cloning bios.
     - add code to split a bio that exceeds BIO_MAX_PAGES.
     - Fix up the comments in blk_queue_split()
    
    Credit-to: Ming Lei <tom.leiming@gmail.com> (suggested using single bio_for_each_segment loop)
    Reviewed-by: NMing Lei <ming.lei@redhat.com>
    Reviewed-by: NChristoph Hellwig <hch@lst.de>
    Signed-off-by: NNeilBrown <neilb@suse.com>
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    a8821f3f
bounce.c 6.4 KB