• Ming Lei's avatar
    block: don't let passthrough IO go into .make_request_fn() · eaedee93
    Ming Lei authored
    commit 14cb0dc6479dc5ebc63b3a459a5d89a2f1b39fed upstream.
    
    Commit a8821f3f("block: Improvements to bounce-buffer handling") tries
    to make sure that the bio to .make_request_fn won't exceed BIO_MAX_PAGES,
    but ignores that passthrough I/O can use blk_queue_bounce() too.
    Especially, passthrough IO may not be sector-aligned, and the check
    of 'sectors < bio_sectors(*bio_orig)' inside __blk_queue_bounce() may
    become true even though the max bvec number doesn't exceed BIO_MAX_PAGES,
    then cause the bio splitted, and the original passthrough bio is submited
    to generic_make_request().
    
    This patch fixes this issue by checking if the bio is passthrough IO,
    and use bio_kmalloc() to allocate the cloned passthrough bio.
    
    Cc: NeilBrown <neilb@suse.com>
    Fixes: a8821f3f("block: Improvements to bounce-buffer handling")
    Tested-by: 's avatarMichele Ballabio <barra_cuda@katamail.com>
    Signed-off-by: 's avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: 's avatarJens Axboe <axboe@kernel.dk>
    Signed-off-by: 's avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    eaedee93