lkml.org 
[lkml]   [2013]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[147/251] zram: destroy all devices on error recovery path in zram_init()
    3.6.11.9-rc1 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Jiang Liu <liuj97@gmail.com>

    [ Upstream commit 39a9b8ac9333e4268ecff7da6c9d1ab3823ff243 ]

    On error recovery path of zram_init(), it leaks the zram device object
    causing the failure. So change create_device() to free allocated
    resources on error path.

    Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
    Acked-by: Minchan Kim <minchan@kernel.org>
    Acked-by: Jerome Marchand <jmarchan@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    drivers/staging/zram/zram_drv.c | 15 +++++++++------
    1 file changed, 9 insertions(+), 6 deletions(-)

    diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c
    index 4322baf..5047bfe 100644
    --- a/drivers/staging/zram/zram_drv.c
    +++ b/drivers/staging/zram/zram_drv.c
    @@ -635,7 +635,7 @@ static const struct block_device_operations zram_devops = {

    static int create_device(struct zram *zram, int device_id)
    {
    - int ret = 0;
    + int ret = -ENOMEM;

    init_rwsem(&zram->lock);
    init_rwsem(&zram->init_lock);
    @@ -645,7 +645,6 @@ static int create_device(struct zram *zram, int device_id)
    if (!zram->queue) {
    pr_err("Error allocating disk queue for device %d\n",
    device_id);
    - ret = -ENOMEM;
    goto out;
    }

    @@ -655,11 +654,9 @@ static int create_device(struct zram *zram, int device_id)
    /* gendisk structure */
    zram->disk = alloc_disk(1);
    if (!zram->disk) {
    - blk_cleanup_queue(zram->queue);
    pr_warn("Error allocating disk structure for device %d\n",
    device_id);
    - ret = -ENOMEM;
    - goto out;
    + goto out_free_queue;
    }

    zram->disk->major = zram_major;
    @@ -688,11 +685,17 @@ static int create_device(struct zram *zram, int device_id)
    &zram_disk_attr_group);
    if (ret < 0) {
    pr_warn("Error creating sysfs group");
    - goto out;
    + goto out_free_disk;
    }

    zram->init_done = 0;
    + return 0;

    +out_free_disk:
    + del_gendisk(zram->disk);
    + put_disk(zram->disk);
    +out_free_queue:
    + blk_cleanup_queue(zram->queue);
    out:
    return ret;
    }
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-09-11 08:01    [W:5.419 / U:0.800 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site