|
@@ -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 = &dev->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;
|
|
|
|
|
|
- /* 1:1 mapping */
|
|
|
- for (i = 0; i < rrpc->nr_luns; i++) {
|
|
|
- int lunid = lun_begin + i;
|
|
|
- struct nvm_lun *lun;
|
|
|
+ i = 0;
|
|
|
|
|
|
- lun = dev->mt->get_lun(dev->parent, lunid);
|
|
|
- if (!lun)
|
|
|
- goto err;
|
|
|
-
|
|
|
- rlun = &rrpc->luns[i];
|
|
|
+ /* 1:1 mapping */
|
|
|
+ list_for_each_entry(lun, lun_list, list) {
|
|
|
+ rlun = &rrpc->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(&rlun->lock);
|
|
|
}
|
|
|
|
|
|
+ WARN_ON(i != rrpc->nr_luns);
|
|
|
+
|
|
|
return 0;
|
|
|
err:
|
|
|
return ret;
|
|
@@ -1410,12 +1408,13 @@ err:
|
|
|
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 = &dev->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;
|