[PATCH 14/20] lightnvm: remove get_lun operation on gennvm

2016-11-18 Thread Javier González
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 
---
 drivers/lightnvm/gennvm.c | 13 +
 drivers/lightnvm/rrpc.c   | 23 +++
 include/linux/lightnvm.h  |  8 ++--
 3 files changed, 14 insertions(+), 30 deletions(-)

diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index 8791a2a..3cf5d59 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)
tdisk->fops = _fops;
tdisk->queue = tqueue;
 
-   targetdata = tt->init(tgt_dev, tdisk, s->lun_begin, s->lun_end);
+   targetdata = tt->init(tgt_dev, tdisk, >lun_list);
if (IS_ERR(targetdata))
goto err_init;
 
@@ -613,16 +613,6 @@ static int gen_erase_blk(struct nvm_dev *dev, struct 
nvm_block *blk, int flags)
return nvm_erase_ppa(dev, , 1, flags);
 }
 
-static struct nvm_lun *gen_get_lun(struct nvm_dev *dev, int lunid)
-{
-   struct gen_dev *gn = dev->mp;
-
-   if (unlikely(lunid >= dev->geo.nr_luns))
-   return NULL;
-
-   return >luns[lunid];
-}
-
 static void gen_lun_info_print(struct nvm_dev *dev)
 {
struct gen_dev *gn = dev->mp;
@@ -655,7 +645,6 @@ static struct nvmm_type gen = {
 
.mark_blk   = gen_mark_blk,
 
-   .get_lun= gen_get_lun,
.lun_info_print = gen_lun_info_print,
 
.get_area   = gen_get_area,
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index 5377c7a..165b9d3 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -1199,10 +1199,11 @@ static void rrpc_luns_free(struct rrpc *rrpc)
kfree(rrpc->luns);
 }
 
-static int rrpc_luns_init(struct rrpc *rrpc, int lun_begin, int lun_end)
+static int rrpc_luns_init(struct rrpc *rrpc, struct list_head *lun_list)
 {
struct nvm_tgt_dev *dev = rrpc->dev;
struct nvm_geo *geo = >geo;
+   struct nvm_lun *lun;
struct rrpc_lun *rlun;
int i, j, ret = -EINVAL;
 
@@ -1218,16 +1219,11 @@ static int rrpc_luns_init(struct rrpc *rrpc, int 
lun_begin, int lun_end)
if (!rrpc->luns)
return -ENOMEM;
 
+   i = 0;
+
/* 1:1 mapping */
-   for (i = 0; i < rrpc->nr_luns; i++) {
-   int lunid = lun_begin + i;
-   struct nvm_lun *lun;
-
-   lun = dev->mt->get_lun(dev->parent, lunid);
-   if (!lun)
-   goto err;
-
-   rlun = >luns[i];
+   list_for_each_entry(lun, lun_list, list) {
+   rlun = >luns[i++];
rlun->parent = lun;
rlun->blocks = vzalloc(sizeof(struct rrpc_block) *
geo->blks_per_lun);
@@ -1256,6 +1252,8 @@ static int rrpc_luns_init(struct rrpc *rrpc, int 
lun_begin, int lun_end)
spin_lock_init(>lock);
}
 
+   WARN_ON(i != rrpc->nr_luns);
+
return 0;
 err:
return ret;
@@ -1410,12 +1408,13 @@ static int rrpc_luns_configure(struct rrpc *rrpc)
 static struct nvm_tgt_type tt_rrpc;
 
 static void *rrpc_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
-   int lun_begin, int lun_end)
+   struct list_head *lun_list)
 {
struct request_queue *bqueue = dev->q;
struct request_queue *tqueue = tdisk->queue;
struct nvm_geo *geo = >geo;
struct rrpc *rrpc;
+   int lun_begin = (list_first_entry(lun_list, struct nvm_lun, list))->id;
sector_t soffset;
int ret;
 
@@ -1450,7 +1449,7 @@ static void *rrpc_init(struct nvm_tgt_dev *dev, struct 
gendisk *tdisk,
}
rrpc->soffset = soffset;
 
-   ret = rrpc_luns_init(rrpc, lun_begin, lun_end);
+   ret = rrpc_luns_init(rrpc, lun_list);
if (ret) {
pr_err("nvm: rrpc: could not initialize luns\n");
goto err;
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 1f1588c..e56c352 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)
 
 typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *);
 typedef sector_t (nvm_tgt_capacity_fn)(void *);
-typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, int,
-   int);
+typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *,
+   struct list_head *lun_list);
 typedef void (nvm_tgt_exit_fn)(void *);
 
 struct nvm_tgt_type {
@@ -541,7 +541,6 @@ typedef int (nvmm_remove_tgt_fn)(struct nvm_dev *, struct 
nvm_ioctl_remove *);
 typedef int (nvmm_submit_io_fn)(struct nvm_dev 

[PATCH 14/20] lightnvm: remove get_lun operation on gennvm

2016-11-18 Thread Javier González
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 
---
 drivers/lightnvm/gennvm.c | 13 +
 drivers/lightnvm/rrpc.c   | 23 +++
 include/linux/lightnvm.h  |  8 ++--
 3 files changed, 14 insertions(+), 30 deletions(-)

diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index 8791a2a..3cf5d59 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)
tdisk->fops = _fops;
tdisk->queue = tqueue;
 
-   targetdata = tt->init(tgt_dev, tdisk, s->lun_begin, s->lun_end);
+   targetdata = tt->init(tgt_dev, tdisk, >lun_list);
if (IS_ERR(targetdata))
goto err_init;
 
@@ -613,16 +613,6 @@ static int gen_erase_blk(struct nvm_dev *dev, struct 
nvm_block *blk, int flags)
return nvm_erase_ppa(dev, , 1, flags);
 }
 
-static struct nvm_lun *gen_get_lun(struct nvm_dev *dev, int lunid)
-{
-   struct gen_dev *gn = dev->mp;
-
-   if (unlikely(lunid >= dev->geo.nr_luns))
-   return NULL;
-
-   return >luns[lunid];
-}
-
 static void gen_lun_info_print(struct nvm_dev *dev)
 {
struct gen_dev *gn = dev->mp;
@@ -655,7 +645,6 @@ static struct nvmm_type gen = {
 
.mark_blk   = gen_mark_blk,
 
-   .get_lun= gen_get_lun,
.lun_info_print = gen_lun_info_print,
 
.get_area   = gen_get_area,
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index 5377c7a..165b9d3 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -1199,10 +1199,11 @@ static void rrpc_luns_free(struct rrpc *rrpc)
kfree(rrpc->luns);
 }
 
-static int rrpc_luns_init(struct rrpc *rrpc, int lun_begin, int lun_end)
+static int rrpc_luns_init(struct rrpc *rrpc, struct list_head *lun_list)
 {
struct nvm_tgt_dev *dev = rrpc->dev;
struct nvm_geo *geo = >geo;
+   struct nvm_lun *lun;
struct rrpc_lun *rlun;
int i, j, ret = -EINVAL;
 
@@ -1218,16 +1219,11 @@ static int rrpc_luns_init(struct rrpc *rrpc, int 
lun_begin, int lun_end)
if (!rrpc->luns)
return -ENOMEM;
 
+   i = 0;
+
/* 1:1 mapping */
-   for (i = 0; i < rrpc->nr_luns; i++) {
-   int lunid = lun_begin + i;
-   struct nvm_lun *lun;
-
-   lun = dev->mt->get_lun(dev->parent, lunid);
-   if (!lun)
-   goto err;
-
-   rlun = >luns[i];
+   list_for_each_entry(lun, lun_list, list) {
+   rlun = >luns[i++];
rlun->parent = lun;
rlun->blocks = vzalloc(sizeof(struct rrpc_block) *
geo->blks_per_lun);
@@ -1256,6 +1252,8 @@ static int rrpc_luns_init(struct rrpc *rrpc, int 
lun_begin, int lun_end)
spin_lock_init(>lock);
}
 
+   WARN_ON(i != rrpc->nr_luns);
+
return 0;
 err:
return ret;
@@ -1410,12 +1408,13 @@ static int rrpc_luns_configure(struct rrpc *rrpc)
 static struct nvm_tgt_type tt_rrpc;
 
 static void *rrpc_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
-   int lun_begin, int lun_end)
+   struct list_head *lun_list)
 {
struct request_queue *bqueue = dev->q;
struct request_queue *tqueue = tdisk->queue;
struct nvm_geo *geo = >geo;
struct rrpc *rrpc;
+   int lun_begin = (list_first_entry(lun_list, struct nvm_lun, list))->id;
sector_t soffset;
int ret;
 
@@ -1450,7 +1449,7 @@ static void *rrpc_init(struct nvm_tgt_dev *dev, struct 
gendisk *tdisk,
}
rrpc->soffset = soffset;
 
-   ret = rrpc_luns_init(rrpc, lun_begin, lun_end);
+   ret = rrpc_luns_init(rrpc, lun_list);
if (ret) {
pr_err("nvm: rrpc: could not initialize luns\n");
goto err;
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 1f1588c..e56c352 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)
 
 typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *);
 typedef sector_t (nvm_tgt_capacity_fn)(void *);
-typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, int,
-   int);
+typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *,
+   struct list_head *lun_list);
 typedef void (nvm_tgt_exit_fn)(void *);
 
 struct nvm_tgt_type {
@@ -541,7 +541,6 @@ typedef int (nvmm_remove_tgt_fn)(struct nvm_dev *, struct 
nvm_ioctl_remove *);
 typedef int (nvmm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *);