lightnvm: double-clear of dev->lun_map on target init error
The dev->lun_map bits are cleared twice if an target init error occurs. First in the target clean routine, and then next in the nvm_tgt_create error function. Make sure that it is only cleared once by extending nvm_remove_tgt_devi() with a clear bit, such that clearing of bits can ignored when cleaning up a successful initialized target. Signed-off-by: Javier González <javier@cnexlabs.com> Fix style. Signed-off-by: Matias Bjørling <matias@cnexlabs.com> Signed-off-by: Matias Bjørling <matias@cnexlabs.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
b0e0306ce1
commit
edee1bdd66
drivers/lightnvm
|
@ -89,7 +89,7 @@ static void nvm_release_luns_err(struct nvm_dev *dev, int lun_begin,
|
|||
WARN_ON(!test_and_clear_bit(i, dev->lun_map));
|
||||
}
|
||||
|
||||
static void nvm_remove_tgt_dev(struct nvm_tgt_dev *tgt_dev)
|
||||
static void nvm_remove_tgt_dev(struct nvm_tgt_dev *tgt_dev, int clear)
|
||||
{
|
||||
struct nvm_dev *dev = tgt_dev->parent;
|
||||
struct nvm_dev_map *dev_map = tgt_dev->map;
|
||||
|
@ -100,11 +100,14 @@ static void nvm_remove_tgt_dev(struct nvm_tgt_dev *tgt_dev)
|
|||
int *lun_offs = ch_map->lun_offs;
|
||||
int ch = i + ch_map->ch_off;
|
||||
|
||||
for (j = 0; j < ch_map->nr_luns; j++) {
|
||||
int lun = j + lun_offs[j];
|
||||
int lunid = (ch * dev->geo.luns_per_chnl) + lun;
|
||||
if (clear) {
|
||||
for (j = 0; j < ch_map->nr_luns; j++) {
|
||||
int lun = j + lun_offs[j];
|
||||
int lunid = (ch * dev->geo.luns_per_chnl) + lun;
|
||||
|
||||
WARN_ON(!test_and_clear_bit(lunid, dev->lun_map));
|
||||
WARN_ON(!test_and_clear_bit(lunid,
|
||||
dev->lun_map));
|
||||
}
|
||||
}
|
||||
|
||||
kfree(ch_map->lun_offs);
|
||||
|
@ -309,7 +312,7 @@ err_init:
|
|||
err_queue:
|
||||
blk_cleanup_queue(tqueue);
|
||||
err_dev:
|
||||
nvm_remove_tgt_dev(tgt_dev);
|
||||
nvm_remove_tgt_dev(tgt_dev, 0);
|
||||
err_t:
|
||||
kfree(t);
|
||||
err_reserve:
|
||||
|
@ -332,7 +335,7 @@ static void __nvm_remove_target(struct nvm_target *t)
|
|||
if (tt->exit)
|
||||
tt->exit(tdisk->private_data);
|
||||
|
||||
nvm_remove_tgt_dev(t->dev);
|
||||
nvm_remove_tgt_dev(t->dev, 1);
|
||||
put_disk(tdisk);
|
||||
|
||||
list_del(&t->list);
|
||||
|
|
Loading…
Reference in New Issue