lkml.org 
[lkml]   [2020]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.5 147/367] dm: fix potential for q->make_request_fn NULL pointer
    Date
    From: Mike Snitzer <snitzer@redhat.com>

    commit 47ace7e012b9f7ad71d43ac9063d335ea3d6820b upstream.

    Move blk_queue_make_request() to dm.c:alloc_dev() so that
    q->make_request_fn is never NULL during the lifetime of a DM device
    (even one that is created without a DM table).

    Otherwise generic_make_request() will crash simply by doing:
    dmsetup create -n test
    mount /dev/dm-N /mnt

    While at it, move ->congested_data initialization out of
    dm.c:alloc_dev() and into the bio-based specific init method.

    Reported-by: Stefan Bader <stefan.bader@canonical.com>
    BugLink: https://bugs.launchpad.net/bugs/1860231
    Fixes: ff36ab34583a ("dm: remove request-based logic from make_request_fn wrapper")
    Depends-on: c12c9a3c3860c ("dm: various cleanups to md->queue initialization code")
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/md/dm.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    --- a/drivers/md/dm.c
    +++ b/drivers/md/dm.c
    @@ -1859,6 +1859,7 @@ static void dm_init_normal_md_queue(stru
    /*
    * Initialize aspects of queue that aren't relevant for blk-mq
    */
    + md->queue->backing_dev_info->congested_data = md;
    md->queue->backing_dev_info->congested_fn = dm_any_congested;
    }

    @@ -1949,7 +1950,12 @@ static struct mapped_device *alloc_dev(i
    if (!md->queue)
    goto bad;
    md->queue->queuedata = md;
    - md->queue->backing_dev_info->congested_data = md;
    + /*
    + * default to bio-based required ->make_request_fn until DM
    + * table is loaded and md->type established. If request-based
    + * table is loaded: blk-mq will override accordingly.
    + */
    + blk_queue_make_request(md->queue, dm_make_request);

    md->disk = alloc_disk_node(1, md->numa_node_id);
    if (!md->disk)
    @@ -2264,7 +2270,6 @@ int dm_setup_md_queue(struct mapped_devi
    case DM_TYPE_DAX_BIO_BASED:
    case DM_TYPE_NVME_BIO_BASED:
    dm_init_normal_md_queue(md);
    - blk_queue_make_request(md->queue, dm_make_request);
    break;
    case DM_TYPE_NONE:
    WARN_ON_ONCE(true);

    \
     
     \ /
      Last update: 2020-02-10 13:45    [W:4.673 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site