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
@ -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));
|
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 *dev = tgt_dev->parent;
|
||||||
struct nvm_dev_map *dev_map = tgt_dev->map;
|
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 *lun_offs = ch_map->lun_offs;
|
||||||
int ch = i + ch_map->ch_off;
|
int ch = i + ch_map->ch_off;
|
||||||
|
|
||||||
for (j = 0; j < ch_map->nr_luns; j++) {
|
if (clear) {
|
||||||
int lun = j + lun_offs[j];
|
for (j = 0; j < ch_map->nr_luns; j++) {
|
||||||
int lunid = (ch * dev->geo.luns_per_chnl) + lun;
|
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);
|
kfree(ch_map->lun_offs);
|
||||||
@ -309,7 +312,7 @@ err_init:
|
|||||||
err_queue:
|
err_queue:
|
||||||
blk_cleanup_queue(tqueue);
|
blk_cleanup_queue(tqueue);
|
||||||
err_dev:
|
err_dev:
|
||||||
nvm_remove_tgt_dev(tgt_dev);
|
nvm_remove_tgt_dev(tgt_dev, 0);
|
||||||
err_t:
|
err_t:
|
||||||
kfree(t);
|
kfree(t);
|
||||||
err_reserve:
|
err_reserve:
|
||||||
@ -332,7 +335,7 @@ static void __nvm_remove_target(struct nvm_target *t)
|
|||||||
if (tt->exit)
|
if (tt->exit)
|
||||||
tt->exit(tdisk->private_data);
|
tt->exit(tdisk->private_data);
|
||||||
|
|
||||||
nvm_remove_tgt_dev(t->dev);
|
nvm_remove_tgt_dev(t->dev, 1);
|
||||||
put_disk(tdisk);
|
put_disk(tdisk);
|
||||||
|
|
||||||
list_del(&t->list);
|
list_del(&t->list);
|
||||||
|
Loading…
Reference in New Issue
Block a user