diff options
author | Matias Bjørling <m@bjorling.me> | 2015-11-16 09:34:43 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-11-16 17:20:33 -0500 |
commit | c1480ad5943261e01a62eaa7132eab76f9c490e0 (patch) | |
tree | ad2c41ab89caa8ae004636b26d495be3f9bbef9b /drivers/lightnvm/core.c | |
parent | edad2e6606ee62dd7dfc5b001fae39c5c8015a55 (diff) |
lightnvm: prevent double free on init error
Both the nvm_register and nvm_init does a kfree(dev) on error. Make sure
to only free it once.
Signed-off-by: Matias Bjørling <m@bjorling.me>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/lightnvm/core.c')
-rw-r--r-- | drivers/lightnvm/core.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index 40e6cfae4585..899f6b9a9f68 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c | |||
@@ -160,11 +160,6 @@ int nvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk) | |||
160 | } | 160 | } |
161 | EXPORT_SYMBOL(nvm_erase_blk); | 161 | EXPORT_SYMBOL(nvm_erase_blk); |
162 | 162 | ||
163 | static void nvm_core_free(struct nvm_dev *dev) | ||
164 | { | ||
165 | kfree(dev); | ||
166 | } | ||
167 | |||
168 | static int nvm_core_init(struct nvm_dev *dev) | 163 | static int nvm_core_init(struct nvm_dev *dev) |
169 | { | 164 | { |
170 | struct nvm_id *id = &dev->identity; | 165 | struct nvm_id *id = &dev->identity; |
@@ -223,8 +218,6 @@ static void nvm_free(struct nvm_dev *dev) | |||
223 | 218 | ||
224 | if (dev->mt) | 219 | if (dev->mt) |
225 | dev->mt->unregister_mgr(dev); | 220 | dev->mt->unregister_mgr(dev); |
226 | |||
227 | nvm_core_free(dev); | ||
228 | } | 221 | } |
229 | 222 | ||
230 | static int nvm_init(struct nvm_dev *dev) | 223 | static int nvm_init(struct nvm_dev *dev) |
@@ -351,11 +344,12 @@ void nvm_unregister(char *disk_name) | |||
351 | return; | 344 | return; |
352 | } | 345 | } |
353 | 346 | ||
354 | nvm_exit(dev); | ||
355 | |||
356 | down_write(&nvm_lock); | 347 | down_write(&nvm_lock); |
357 | list_del(&dev->devices); | 348 | list_del(&dev->devices); |
358 | up_write(&nvm_lock); | 349 | up_write(&nvm_lock); |
350 | |||
351 | nvm_exit(dev); | ||
352 | kfree(dev); | ||
359 | } | 353 | } |
360 | EXPORT_SYMBOL(nvm_unregister); | 354 | EXPORT_SYMBOL(nvm_unregister); |
361 | 355 | ||