On Wed, 4 Feb 2015 10:07:20 +0900 Sergey Senozhatsky 
<sergey.senozhatsky.w...@gmail.com> wrote:

> Set dev_id to zero and fix zram_devices allocation error handling
> path, can pass uninit dev_id to destroy_devices().
> 
> cosmetic:
> change destroy_devices() message from pr_debug() to pr_info(), as
> proposed by Minchan Kim.
> 

Seems unnecessarily complicated.  What about

--- a/drivers/block/zram/zram_drv.c~zram-rework-reset-and-destroy-path-fix-2-fix
+++ a/drivers/block/zram/zram_drv.c
@@ -1141,7 +1141,8 @@ static void destroy_devices(unsigned int
 
 static int __init zram_init(void)
 {
-       int ret = -ENOMEM, dev_id = 0;
+       int ret;
+       int dev_id;
 
        if (num_devices > max_num_devices) {
                pr_warn("Invalid value for num_devices: %u\n",
@@ -1157,20 +1158,23 @@ static int __init zram_init(void)
 
        /* Allocate the device array and initialize each one */
        zram_devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL);
-       if (!zram_devices)
-               goto out_error;
+       if (!zram_devices) {
+               ret = -ENOMEM;
+               goto out;
+       }
 
        for (dev_id = 0; dev_id < num_devices; dev_id++) {
                ret = create_device(&zram_devices[dev_id], dev_id);
                if (ret)
-                       goto out_error;
+                       goto out_devices;
        }
 
        pr_info("Created %u device(s)\n", num_devices);
        return 0;
 
-out_error:
+out_devices:
        destroy_devices(dev_id);
+out:
        return ret;
 }

which yields

static int __init zram_init(void)
{
        int ret;
        int dev_id;

        if (num_devices > max_num_devices) {
                pr_warn("Invalid value for num_devices: %u\n",
                                num_devices);
                return -EINVAL;
        }

        zram_major = register_blkdev(0, "zram");
        if (zram_major <= 0) {
                pr_warn("Unable to get major number\n");
                return -EBUSY;
        }

        /* Allocate the device array and initialize each one */
        zram_devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL);
        if (!zram_devices) {
                ret = -ENOMEM;
                goto out;
        }

        for (dev_id = 0; dev_id < num_devices; dev_id++) {
                ret = create_device(&zram_devices[dev_id], dev_id);
                if (ret)
                        goto out_devices;
        }

        pr_info("Created %u device(s)\n", num_devices);
        return 0;

out_devices:
        destroy_devices(dev_id);
out:
        return ret;
}

 
_

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to