struct proc_dir_entry *procdir)
 {
        char tmp[2] = { '0' + which, 0 };
+       int err = -ENOMEM;
 
        dev->fd = -1;
        dev->filename = NULL;
 
        dev->gd = blk_alloc_disk(NUMA_NO_NODE);
        if (!dev->gd)
-               return -ENOMEM;
+               goto out;
        dev->gd->major = simdisk_major;
        dev->gd->first_minor = which;
        dev->gd->minors = SIMDISK_MINORS;
        dev->gd->private_data = dev;
        snprintf(dev->gd->disk_name, 32, "simdisk%d", which);
        set_capacity(dev->gd, 0);
-       add_disk(dev->gd);
+       err = add_disk(dev->gd);
+       if (err)
+               goto out_cleanup_disk;
 
        dev->procfile = proc_create_data(tmp, 0644, procdir, &simdisk_proc_ops, dev);
+
        return 0;
+
+out_cleanup_disk:
+       blk_cleanup_disk(dev->gd);
+out:
+       return err;
 }
 
 static int __init simdisk_init(void)