lkml.org 
[lkml]   [2020]   [Oct]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/18] loop: use __register_blkdev to allocate devices on demand
    Date
    Use the simpler mechanism attached to major_name to allocate a brd device
    when a currently unregistered minor is accessed.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    ---
    drivers/block/loop.c | 30 ++++++++----------------------
    1 file changed, 8 insertions(+), 22 deletions(-)

    diff --git a/drivers/block/loop.c b/drivers/block/loop.c
    index cb1191d6e945f2..15b5a0ea7cc4a9 100644
    --- a/drivers/block/loop.c
    +++ b/drivers/block/loop.c
    @@ -2234,24 +2234,18 @@ static int loop_lookup(struct loop_device **l, int i)
    return ret;
    }

    -static struct kobject *loop_probe(dev_t dev, int *part, void *data)
    +static void loop_probe(dev_t dev)
    {
    + int idx = MINOR(dev) >> part_shift;
    struct loop_device *lo;
    - struct kobject *kobj;
    - int err;
    +
    + if (max_loop && idx >= max_loop)
    + return;

    mutex_lock(&loop_ctl_mutex);
    - err = loop_lookup(&lo, MINOR(dev) >> part_shift);
    - if (err < 0)
    - err = loop_add(&lo, MINOR(dev) >> part_shift);
    - if (err < 0)
    - kobj = NULL;
    - else
    - kobj = get_disk_and_module(lo->lo_disk);
    + if (loop_lookup(&lo, idx) < 0)
    + loop_add(&lo, idx);
    mutex_unlock(&loop_ctl_mutex);
    -
    - *part = 0;
    - return kobj;
    }

    static long loop_control_ioctl(struct file *file, unsigned int cmd,
    @@ -2371,14 +2365,11 @@ static int __init loop_init(void)
    goto err_out;


    - if (register_blkdev(LOOP_MAJOR, "loop")) {
    + if (__register_blkdev(LOOP_MAJOR, "loop", loop_probe)) {
    err = -EIO;
    goto misc_out;
    }

    - blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
    - THIS_MODULE, loop_probe, NULL, NULL);
    -
    /* pre-create number of devices given by config or max_loop */
    mutex_lock(&loop_ctl_mutex);
    for (i = 0; i < nr; i++)
    @@ -2404,16 +2395,11 @@ static int loop_exit_cb(int id, void *ptr, void *data)

    static void __exit loop_exit(void)
    {
    - unsigned long range;
    -
    - range = max_loop ? max_loop << part_shift : 1UL << MINORBITS;
    -
    mutex_lock(&loop_ctl_mutex);

    idr_for_each(&loop_index_idr, &loop_exit_cb, NULL);
    idr_destroy(&loop_index_idr);

    - blk_unregister_region(MKDEV(LOOP_MAJOR, 0), range);
    unregister_blkdev(LOOP_MAJOR, "loop");

    misc_deregister(&loop_misc);
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-10-29 16:25    [W:2.807 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site