aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJavier González <jg@lightnvm.io>2016-11-28 16:39:07 -0500
committerJens Axboe <axboe@fb.com>2016-11-29 14:12:51 -0500
commit0ac4072eb10c9627415eb1ca511121156e20012c (patch)
treea2581ae27e54d08e0f95bdff8712fd5daade109e
parent8e79b5cb1d3b8eceaf6862995952dd4de431dd99 (diff)
lightnvm: remove get_lun operation on gennvm
Since LUNs are managed internally on the target, there is no need for the media manager to implement a get_lun operation. Signed-off-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/lightnvm/gennvm.c13
-rw-r--r--drivers/lightnvm/rrpc.c23
-rw-r--r--include/linux/lightnvm.h8
3 files changed, 14 insertions, 30 deletions
diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index 8791a2aaa9e3..3cf5d5947070 100644
--- a/drivers/lightnvm/gennvm.c
+++ b/drivers/lightnvm/gennvm.c
@@ -159,7 +159,7 @@ static int gen_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
159 tdisk->fops = &gen_fops; 159 tdisk->fops = &gen_fops;
160 tdisk->queue = tqueue; 160 tdisk->queue = tqueue;
161 161
162 targetdata = tt->init(tgt_dev, tdisk, s->lun_begin, s->lun_end); 162 targetdata = tt->init(tgt_dev, tdisk, &t->lun_list);
163 if (IS_ERR(targetdata)) 163 if (IS_ERR(targetdata))
164 goto err_init; 164 goto err_init;
165 165
@@ -613,16 +613,6 @@ static int gen_erase_blk(struct nvm_dev *dev, struct nvm_block *blk, int flags)
613 return nvm_erase_ppa(dev, &addr, 1, flags); 613 return nvm_erase_ppa(dev, &addr, 1, flags);
614} 614}
615 615
616static struct nvm_lun *gen_get_lun(struct nvm_dev *dev, int lunid)
617{
618 struct gen_dev *gn = dev->mp;
619
620 if (unlikely(lunid >= dev->geo.nr_luns))
621 return NULL;
622
623 return &gn->luns[lunid];
624}
625
626static void gen_lun_info_print(struct nvm_dev *dev) 616static void gen_lun_info_print(struct nvm_dev *dev)
627{ 617{
628 struct gen_dev *gn = dev->mp; 618 struct gen_dev *gn = dev->mp;
@@ -655,7 +645,6 @@ static struct nvmm_type gen = {
655 645
656 .mark_blk = gen_mark_blk, 646 .mark_blk = gen_mark_blk,
657 647
658 .get_lun = gen_get_lun,
659 .lun_info_print = gen_lun_info_print, 648 .lun_info_print = gen_lun_info_print,
660 649
661 .get_area = gen_get_area, 650 .get_area = gen_get_area,
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index 5377c7a987aa..165b9d396493 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -1199,10 +1199,11 @@ static void rrpc_luns_free(struct rrpc *rrpc)
1199 kfree(rrpc->luns); 1199 kfree(rrpc->luns);
1200} 1200}
1201 1201
1202static int rrpc_luns_init(struct rrpc *rrpc, int lun_begin, int lun_end) 1202static int rrpc_luns_init(struct rrpc *rrpc, struct list_head *lun_list)
1203{ 1203{
1204 struct nvm_tgt_dev *dev = rrpc->dev; 1204 struct nvm_tgt_dev *dev = rrpc->dev;
1205 struct nvm_geo *geo = &dev->geo; 1205 struct nvm_geo *geo = &dev->geo;
1206 struct nvm_lun *lun;
1206 struct rrpc_lun *rlun; 1207 struct rrpc_lun *rlun;
1207 int i, j, ret = -EINVAL; 1208 int i, j, ret = -EINVAL;
1208 1209
@@ -1218,16 +1219,11 @@ static int rrpc_luns_init(struct rrpc *rrpc, int lun_begin, int lun_end)
1218 if (!rrpc->luns) 1219 if (!rrpc->luns)
1219 return -ENOMEM; 1220 return -ENOMEM;
1220 1221
1221 /* 1:1 mapping */ 1222 i = 0;
1222 for (i = 0; i < rrpc->nr_luns; i++) {
1223 int lunid = lun_begin + i;
1224 struct nvm_lun *lun;
1225 1223
1226 lun = dev->mt->get_lun(dev->parent, lunid); 1224 /* 1:1 mapping */
1227 if (!lun) 1225 list_for_each_entry(lun, lun_list, list) {
1228 goto err; 1226 rlun = &rrpc->luns[i++];
1229
1230 rlun = &rrpc->luns[i];
1231 rlun->parent = lun; 1227 rlun->parent = lun;
1232 rlun->blocks = vzalloc(sizeof(struct rrpc_block) * 1228 rlun->blocks = vzalloc(sizeof(struct rrpc_block) *
1233 geo->blks_per_lun); 1229 geo->blks_per_lun);
@@ -1256,6 +1252,8 @@ static int rrpc_luns_init(struct rrpc *rrpc, int lun_begin, int lun_end)
1256 spin_lock_init(&rlun->lock); 1252 spin_lock_init(&rlun->lock);
1257 } 1253 }
1258 1254
1255 WARN_ON(i != rrpc->nr_luns);
1256
1259 return 0; 1257 return 0;
1260err: 1258err:
1261 return ret; 1259 return ret;
@@ -1410,12 +1408,13 @@ err:
1410static struct nvm_tgt_type tt_rrpc; 1408static struct nvm_tgt_type tt_rrpc;
1411 1409
1412static void *rrpc_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk, 1410static void *rrpc_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
1413 int lun_begin, int lun_end) 1411 struct list_head *lun_list)
1414{ 1412{
1415 struct request_queue *bqueue = dev->q; 1413 struct request_queue *bqueue = dev->q;
1416 struct request_queue *tqueue = tdisk->queue; 1414 struct request_queue *tqueue = tdisk->queue;
1417 struct nvm_geo *geo = &dev->geo; 1415 struct nvm_geo *geo = &dev->geo;
1418 struct rrpc *rrpc; 1416 struct rrpc *rrpc;
1417 int lun_begin = (list_first_entry(lun_list, struct nvm_lun, list))->id;
1419 sector_t soffset; 1418 sector_t soffset;
1420 int ret; 1419 int ret;
1421 1420
@@ -1450,7 +1449,7 @@ static void *rrpc_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
1450 } 1449 }
1451 rrpc->soffset = soffset; 1450 rrpc->soffset = soffset;
1452 1451
1453 ret = rrpc_luns_init(rrpc, lun_begin, lun_end); 1452 ret = rrpc_luns_init(rrpc, lun_list);
1454 if (ret) { 1453 if (ret) {
1455 pr_err("nvm: rrpc: could not initialize luns\n"); 1454 pr_err("nvm: rrpc: could not initialize luns\n");
1456 goto err; 1455 goto err;
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 1f1588c2557e..e56c35227249 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -504,8 +504,8 @@ static inline int ppa_to_slc(struct nvm_dev *dev, int slc_pg)
504 504
505typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *); 505typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *);
506typedef sector_t (nvm_tgt_capacity_fn)(void *); 506typedef sector_t (nvm_tgt_capacity_fn)(void *);
507typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, int, 507typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *,
508 int); 508 struct list_head *lun_list);
509typedef void (nvm_tgt_exit_fn)(void *); 509typedef void (nvm_tgt_exit_fn)(void *);
510 510
511struct nvm_tgt_type { 511struct nvm_tgt_type {
@@ -541,7 +541,6 @@ typedef int (nvmm_remove_tgt_fn)(struct nvm_dev *, struct nvm_ioctl_remove *);
541typedef int (nvmm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *); 541typedef int (nvmm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *);
542typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *, int); 542typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *, int);
543typedef void (nvmm_mark_blk_fn)(struct nvm_dev *, struct ppa_addr, int); 543typedef void (nvmm_mark_blk_fn)(struct nvm_dev *, struct ppa_addr, int);
544typedef struct nvm_lun *(nvmm_get_lun_fn)(struct nvm_dev *, int);
545typedef void (nvmm_lun_info_print_fn)(struct nvm_dev *); 544typedef void (nvmm_lun_info_print_fn)(struct nvm_dev *);
546 545
547typedef int (nvmm_get_area_fn)(struct nvm_dev *, sector_t *, sector_t); 546typedef int (nvmm_get_area_fn)(struct nvm_dev *, sector_t *, sector_t);
@@ -563,9 +562,6 @@ struct nvmm_type {
563 /* Bad block mgmt */ 562 /* Bad block mgmt */
564 nvmm_mark_blk_fn *mark_blk; 563 nvmm_mark_blk_fn *mark_blk;
565 564
566 /* Configuration management */
567 nvmm_get_lun_fn *get_lun;
568
569 /* Statistics */ 565 /* Statistics */
570 nvmm_lun_info_print_fn *lun_info_print; 566 nvmm_lun_info_print_fn *lun_info_print;
571 567