diff options
author | Jan Kara <jack@suse.cz> | 2017-03-08 08:56:05 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-03-08 12:55:40 -0500 |
commit | 672a2c87c83649fb0167202342ce85af9a3b4f1c (patch) | |
tree | b871c356005788f0738f963e0aacc154c9d88bee /arch/powerpc/sysdev/axonram.c | |
parent | 79bd99596b7305ab08109a8bf44a6a4511dbf1cd (diff) |
axonram: Fix gendisk handling
It is invalid to call del_gendisk() when disk->queue is NULL. Fix error
handling in axon_ram_probe() to avoid doing that.
Also del_gendisk() does not drop a reference to gendisk allocated by
alloc_disk(). That has to be done by put_disk(). Add that call where
needed.
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'arch/powerpc/sysdev/axonram.c')
-rw-r--r-- | arch/powerpc/sysdev/axonram.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index ada29eaed6e2..f523ac883150 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c | |||
@@ -274,7 +274,9 @@ failed: | |||
274 | if (bank->disk->major > 0) | 274 | if (bank->disk->major > 0) |
275 | unregister_blkdev(bank->disk->major, | 275 | unregister_blkdev(bank->disk->major, |
276 | bank->disk->disk_name); | 276 | bank->disk->disk_name); |
277 | del_gendisk(bank->disk); | 277 | if (bank->disk->flags & GENHD_FL_UP) |
278 | del_gendisk(bank->disk); | ||
279 | put_disk(bank->disk); | ||
278 | } | 280 | } |
279 | device->dev.platform_data = NULL; | 281 | device->dev.platform_data = NULL; |
280 | if (bank->io_addr != 0) | 282 | if (bank->io_addr != 0) |
@@ -299,6 +301,7 @@ axon_ram_remove(struct platform_device *device) | |||
299 | device_remove_file(&device->dev, &dev_attr_ecc); | 301 | device_remove_file(&device->dev, &dev_attr_ecc); |
300 | free_irq(bank->irq_id, device); | 302 | free_irq(bank->irq_id, device); |
301 | del_gendisk(bank->disk); | 303 | del_gendisk(bank->disk); |
304 | put_disk(bank->disk); | ||
302 | iounmap((void __iomem *) bank->io_addr); | 305 | iounmap((void __iomem *) bank->io_addr); |
303 | kfree(bank); | 306 | kfree(bank); |
304 | 307 | ||