diff options
author | Wenwei Tao <ww.tao0320@gmail.com> | 2016-03-03 09:06:38 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-03-18 21:10:38 -0400 |
commit | da1e284919b0b99c5bf0618b6c98cbaf2c17e62e (patch) | |
tree | ef1d8fe8821376dd57fbd4d3319a747841df38e6 /drivers/lightnvm/core.c | |
parent | 4c9dacb82d5aa36aa2568df60d897f2eb3d8819b (diff) |
lightnvm: add a bitmap of luns
Add a bitmap of luns to indicate the status
of luns: inuse/available. When create targets
do the necessary check to avoid allocating luns
that are already allocated.
Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com>
Freed dev->lun_map if nvm_core_init later failed in the init process.
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 | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index 2925fd0b82bb..0dc9a80adb94 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c | |||
@@ -464,6 +464,10 @@ static int nvm_core_init(struct nvm_dev *dev) | |||
464 | dev->nr_luns = dev->luns_per_chnl * dev->nr_chnls; | 464 | dev->nr_luns = dev->luns_per_chnl * dev->nr_chnls; |
465 | 465 | ||
466 | dev->total_secs = dev->nr_luns * dev->sec_per_lun; | 466 | dev->total_secs = dev->nr_luns * dev->sec_per_lun; |
467 | dev->lun_map = kcalloc(BITS_TO_LONGS(dev->nr_luns), | ||
468 | sizeof(unsigned long), GFP_KERNEL); | ||
469 | if (!dev->lun_map) | ||
470 | return -ENOMEM; | ||
467 | INIT_LIST_HEAD(&dev->online_targets); | 471 | INIT_LIST_HEAD(&dev->online_targets); |
468 | mutex_init(&dev->mlock); | 472 | mutex_init(&dev->mlock); |
469 | spin_lock_init(&dev->lock); | 473 | spin_lock_init(&dev->lock); |
@@ -586,6 +590,7 @@ int nvm_register(struct request_queue *q, char *disk_name, | |||
586 | 590 | ||
587 | return 0; | 591 | return 0; |
588 | err_init: | 592 | err_init: |
593 | kfree(dev->lun_map); | ||
589 | kfree(dev); | 594 | kfree(dev); |
590 | return ret; | 595 | return ret; |
591 | } | 596 | } |
@@ -608,6 +613,7 @@ void nvm_unregister(char *disk_name) | |||
608 | up_write(&nvm_lock); | 613 | up_write(&nvm_lock); |
609 | 614 | ||
610 | nvm_exit(dev); | 615 | nvm_exit(dev); |
616 | kfree(dev->lun_map); | ||
611 | kfree(dev); | 617 | kfree(dev); |
612 | } | 618 | } |
613 | EXPORT_SYMBOL(nvm_unregister); | 619 | EXPORT_SYMBOL(nvm_unregister); |