summaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm
diff options
context:
space:
mode:
authorMatias Bjørling <matias@cnexlabs.com>2018-01-05 08:16:03 -0500
committerJens Axboe <axboe@kernel.dk>2018-01-05 10:50:12 -0500
commitfae7fae4077c24dc2be720b9f21f53adea98d7dd (patch)
treef77436958399d9caa2f4198f7aeeb706867ac24d /drivers/lightnvm
parentbb27aa9ecd1f72e68b0fa2dffeb45bee3b1cb5ca (diff)
lightnvm: make geometry structures 2.0 ready
Prepare for the 2.0 revision by adapting the geometry structures to coexist with the 1.2 revision. Signed-off-by: Matias Bjørling <m@bjorling.me> Reviewed-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm')
-rw-r--r--drivers/lightnvm/core.c91
-rw-r--r--drivers/lightnvm/pblk-core.c6
-rw-r--r--drivers/lightnvm/pblk-init.c62
-rw-r--r--drivers/lightnvm/pblk-recovery.c2
-rw-r--r--drivers/lightnvm/pblk-sysfs.c6
-rw-r--r--drivers/lightnvm/pblk.h8
6 files changed, 87 insertions, 88 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 52059dd0ed18..6d6d2c12ff5b 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -98,7 +98,7 @@ static void nvm_remove_tgt_dev(struct nvm_tgt_dev *tgt_dev, int clear)
98 if (clear) { 98 if (clear) {
99 for (j = 0; j < ch_map->nr_luns; j++) { 99 for (j = 0; j < ch_map->nr_luns; j++) {
100 int lun = j + lun_offs[j]; 100 int lun = j + lun_offs[j];
101 int lunid = (ch * dev->geo.luns_per_chnl) + lun; 101 int lunid = (ch * dev->geo.nr_luns) + lun;
102 102
103 WARN_ON(!test_and_clear_bit(lunid, 103 WARN_ON(!test_and_clear_bit(lunid,
104 dev->lun_map)); 104 dev->lun_map));
@@ -124,10 +124,10 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev,
124 struct ppa_addr *luns; 124 struct ppa_addr *luns;
125 int nr_luns = lun_end - lun_begin + 1; 125 int nr_luns = lun_end - lun_begin + 1;
126 int luns_left = nr_luns; 126 int luns_left = nr_luns;
127 int nr_chnls = nr_luns / dev->geo.luns_per_chnl; 127 int nr_chnls = nr_luns / dev->geo.nr_luns;
128 int nr_chnls_mod = nr_luns % dev->geo.luns_per_chnl; 128 int nr_chnls_mod = nr_luns % dev->geo.nr_luns;
129 int bch = lun_begin / dev->geo.luns_per_chnl; 129 int bch = lun_begin / dev->geo.nr_luns;
130 int blun = lun_begin % dev->geo.luns_per_chnl; 130 int blun = lun_begin % dev->geo.nr_luns;
131 int lunid = 0; 131 int lunid = 0;
132 int lun_balanced = 1; 132 int lun_balanced = 1;
133 int prev_nr_luns; 133 int prev_nr_luns;
@@ -148,15 +148,15 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev,
148 if (!luns) 148 if (!luns)
149 goto err_luns; 149 goto err_luns;
150 150
151 prev_nr_luns = (luns_left > dev->geo.luns_per_chnl) ? 151 prev_nr_luns = (luns_left > dev->geo.nr_luns) ?
152 dev->geo.luns_per_chnl : luns_left; 152 dev->geo.nr_luns : luns_left;
153 for (i = 0; i < nr_chnls; i++) { 153 for (i = 0; i < nr_chnls; i++) {
154 struct nvm_ch_map *ch_rmap = &dev_rmap->chnls[i + bch]; 154 struct nvm_ch_map *ch_rmap = &dev_rmap->chnls[i + bch];
155 int *lun_roffs = ch_rmap->lun_offs; 155 int *lun_roffs = ch_rmap->lun_offs;
156 struct nvm_ch_map *ch_map = &dev_map->chnls[i]; 156 struct nvm_ch_map *ch_map = &dev_map->chnls[i];
157 int *lun_offs; 157 int *lun_offs;
158 int luns_in_chnl = (luns_left > dev->geo.luns_per_chnl) ? 158 int luns_in_chnl = (luns_left > dev->geo.nr_luns) ?
159 dev->geo.luns_per_chnl : luns_left; 159 dev->geo.nr_luns : luns_left;
160 160
161 if (lun_balanced && prev_nr_luns != luns_in_chnl) 161 if (lun_balanced && prev_nr_luns != luns_in_chnl)
162 lun_balanced = 0; 162 lun_balanced = 0;
@@ -193,8 +193,8 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev,
193 memcpy(&tgt_dev->geo, &dev->geo, sizeof(struct nvm_geo)); 193 memcpy(&tgt_dev->geo, &dev->geo, sizeof(struct nvm_geo));
194 /* Target device only owns a portion of the physical device */ 194 /* Target device only owns a portion of the physical device */
195 tgt_dev->geo.nr_chnls = nr_chnls; 195 tgt_dev->geo.nr_chnls = nr_chnls;
196 tgt_dev->geo.nr_luns = nr_luns; 196 tgt_dev->geo.all_luns = nr_luns;
197 tgt_dev->geo.luns_per_chnl = (lun_balanced) ? prev_nr_luns : -1; 197 tgt_dev->geo.nr_luns = (lun_balanced) ? prev_nr_luns : -1;
198 tgt_dev->total_secs = nr_luns * tgt_dev->geo.sec_per_lun; 198 tgt_dev->total_secs = nr_luns * tgt_dev->geo.sec_per_lun;
199 tgt_dev->q = dev->q; 199 tgt_dev->q = dev->q;
200 tgt_dev->map = dev_map; 200 tgt_dev->map = dev_map;
@@ -414,7 +414,7 @@ static int nvm_register_map(struct nvm_dev *dev)
414 for (i = 0; i < dev->geo.nr_chnls; i++) { 414 for (i = 0; i < dev->geo.nr_chnls; i++) {
415 struct nvm_ch_map *ch_rmap; 415 struct nvm_ch_map *ch_rmap;
416 int *lun_roffs; 416 int *lun_roffs;
417 int luns_in_chnl = dev->geo.luns_per_chnl; 417 int luns_in_chnl = dev->geo.nr_luns;
418 418
419 ch_rmap = &rmap->chnls[i]; 419 ch_rmap = &rmap->chnls[i];
420 420
@@ -717,10 +717,10 @@ int nvm_bb_tbl_fold(struct nvm_dev *dev, u8 *blks, int nr_blks)
717 struct nvm_geo *geo = &dev->geo; 717 struct nvm_geo *geo = &dev->geo;
718 int blk, offset, pl, blktype; 718 int blk, offset, pl, blktype;
719 719
720 if (nr_blks != geo->blks_per_lun * geo->plane_mode) 720 if (nr_blks != geo->nr_chks * geo->plane_mode)
721 return -EINVAL; 721 return -EINVAL;
722 722
723 for (blk = 0; blk < geo->blks_per_lun; blk++) { 723 for (blk = 0; blk < geo->nr_chks; blk++) {
724 offset = blk * geo->plane_mode; 724 offset = blk * geo->plane_mode;
725 blktype = blks[offset]; 725 blktype = blks[offset];
726 726
@@ -736,7 +736,7 @@ int nvm_bb_tbl_fold(struct nvm_dev *dev, u8 *blks, int nr_blks)
736 blks[blk] = blktype; 736 blks[blk] = blktype;
737 } 737 }
738 738
739 return geo->blks_per_lun; 739 return geo->nr_chks;
740} 740}
741EXPORT_SYMBOL(nvm_bb_tbl_fold); 741EXPORT_SYMBOL(nvm_bb_tbl_fold);
742 742
@@ -758,43 +758,40 @@ static int nvm_core_init(struct nvm_dev *dev)
758 struct nvm_geo *geo = &dev->geo; 758 struct nvm_geo *geo = &dev->geo;
759 int ret; 759 int ret;
760 760
761 memcpy(&geo->ppaf, &id->ppaf, sizeof(struct nvm_addr_format));
762
763 if (grp->mtype != 0) {
764 pr_err("nvm: memory type not supported\n");
765 return -EINVAL;
766 }
767
761 /* Whole device values */ 768 /* Whole device values */
762 geo->nr_chnls = grp->num_ch; 769 geo->nr_chnls = grp->num_ch;
763 geo->luns_per_chnl = grp->num_lun; 770 geo->nr_luns = grp->num_lun;
764 771
765 /* Generic device values */ 772 /* Generic device geometry values */
766 geo->pgs_per_blk = grp->num_pg; 773 geo->ws_min = grp->ws_min;
767 geo->blks_per_lun = grp->num_blk; 774 geo->ws_opt = grp->ws_opt;
768 geo->nr_planes = grp->num_pln; 775 geo->ws_seq = grp->ws_seq;
769 geo->fpg_size = grp->fpg_sz; 776 geo->ws_per_chk = grp->ws_per_chk;
770 geo->pfpg_size = grp->fpg_sz * grp->num_pln; 777 geo->nr_chks = grp->num_chk;
771 geo->sec_size = grp->csecs; 778 geo->sec_size = grp->csecs;
772 geo->oob_size = grp->sos; 779 geo->oob_size = grp->sos;
773 geo->sec_per_pg = grp->fpg_sz / grp->csecs;
774 geo->mccap = grp->mccap; 780 geo->mccap = grp->mccap;
775 memcpy(&geo->ppaf, &id->ppaf, sizeof(struct nvm_addr_format));
776
777 geo->plane_mode = NVM_PLANE_SINGLE;
778 geo->max_rq_size = dev->ops->max_phys_sect * geo->sec_size; 781 geo->max_rq_size = dev->ops->max_phys_sect * geo->sec_size;
779 782
780 if (grp->mpos & 0x020202) 783 geo->sec_per_chk = grp->clba;
781 geo->plane_mode = NVM_PLANE_DOUBLE; 784 geo->sec_per_lun = geo->sec_per_chk * geo->nr_chks;
782 if (grp->mpos & 0x040404) 785 geo->all_luns = geo->nr_luns * geo->nr_chnls;
783 geo->plane_mode = NVM_PLANE_QUAD;
784
785 if (grp->mtype != 0) {
786 pr_err("nvm: memory type not supported\n");
787 return -EINVAL;
788 }
789 786
790 /* calculated values */ 787 /* 1.2 spec device geometry values */
788 geo->plane_mode = 1 << geo->ws_seq;
789 geo->nr_planes = geo->ws_opt / geo->ws_min;
790 geo->sec_per_pg = geo->ws_min;
791 geo->sec_per_pl = geo->sec_per_pg * geo->nr_planes; 791 geo->sec_per_pl = geo->sec_per_pg * geo->nr_planes;
792 geo->sec_per_blk = geo->sec_per_pl * geo->pgs_per_blk;
793 geo->sec_per_lun = geo->sec_per_blk * geo->blks_per_lun;
794 geo->nr_luns = geo->luns_per_chnl * geo->nr_chnls;
795 792
796 dev->total_secs = geo->nr_luns * geo->sec_per_lun; 793 dev->total_secs = geo->all_luns * geo->sec_per_lun;
797 dev->lun_map = kcalloc(BITS_TO_LONGS(geo->nr_luns), 794 dev->lun_map = kcalloc(BITS_TO_LONGS(geo->all_luns),
798 sizeof(unsigned long), GFP_KERNEL); 795 sizeof(unsigned long), GFP_KERNEL);
799 if (!dev->lun_map) 796 if (!dev->lun_map)
800 return -ENOMEM; 797 return -ENOMEM;
@@ -854,8 +851,8 @@ static int nvm_init(struct nvm_dev *dev)
854 851
855 pr_info("nvm: registered %s [%u/%u/%u/%u/%u/%u]\n", 852 pr_info("nvm: registered %s [%u/%u/%u/%u/%u/%u]\n",
856 dev->name, geo->sec_per_pg, geo->nr_planes, 853 dev->name, geo->sec_per_pg, geo->nr_planes,
857 geo->pgs_per_blk, geo->blks_per_lun, 854 geo->ws_per_chk, geo->nr_chks,
858 geo->nr_luns, geo->nr_chnls); 855 geo->all_luns, geo->nr_chnls);
859 return 0; 856 return 0;
860err: 857err:
861 pr_err("nvm: failed to initialize nvm\n"); 858 pr_err("nvm: failed to initialize nvm\n");
@@ -946,12 +943,12 @@ static int __nvm_configure_create(struct nvm_ioctl_create *create)
946 943
947 if (s->lun_begin == -1 && s->lun_end == -1) { 944 if (s->lun_begin == -1 && s->lun_end == -1) {
948 s->lun_begin = 0; 945 s->lun_begin = 0;
949 s->lun_end = dev->geo.nr_luns - 1; 946 s->lun_end = dev->geo.all_luns - 1;
950 } 947 }
951 948
952 if (s->lun_begin > s->lun_end || s->lun_end >= dev->geo.nr_luns) { 949 if (s->lun_begin > s->lun_end || s->lun_end >= dev->geo.all_luns) {
953 pr_err("nvm: lun out of bound (%u:%u > %u)\n", 950 pr_err("nvm: lun out of bound (%u:%u > %u)\n",
954 s->lun_begin, s->lun_end, dev->geo.nr_luns - 1); 951 s->lun_begin, s->lun_end, dev->geo.all_luns - 1);
955 return -EINVAL; 952 return -EINVAL;
956 } 953 }
957 954
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 76516ee84e9a..0849046b2a7a 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -979,7 +979,7 @@ static int pblk_line_init_metadata(struct pblk *pblk, struct pblk_line *line,
979 979
980 /* Start metadata */ 980 /* Start metadata */
981 smeta_buf->seq_nr = cpu_to_le64(line->seq_nr); 981 smeta_buf->seq_nr = cpu_to_le64(line->seq_nr);
982 smeta_buf->window_wr_lun = cpu_to_le32(geo->nr_luns); 982 smeta_buf->window_wr_lun = cpu_to_le32(geo->all_luns);
983 983
984 /* Fill metadata among lines */ 984 /* Fill metadata among lines */
985 if (cur) { 985 if (cur) {
@@ -1032,7 +1032,7 @@ static int pblk_line_init_bb(struct pblk *pblk, struct pblk_line *line,
1032 lm->sec_per_line); 1032 lm->sec_per_line);
1033 bitmap_or(line->map_bitmap, line->map_bitmap, l_mg->bb_aux, 1033 bitmap_or(line->map_bitmap, line->map_bitmap, l_mg->bb_aux,
1034 lm->sec_per_line); 1034 lm->sec_per_line);
1035 line->sec_in_line -= geo->sec_per_blk; 1035 line->sec_in_line -= geo->sec_per_chk;
1036 if (bit >= lm->emeta_bb) 1036 if (bit >= lm->emeta_bb)
1037 nr_bb++; 1037 nr_bb++;
1038 } 1038 }
@@ -1746,7 +1746,7 @@ void pblk_up_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas,
1746 struct nvm_tgt_dev *dev = pblk->dev; 1746 struct nvm_tgt_dev *dev = pblk->dev;
1747 struct nvm_geo *geo = &dev->geo; 1747 struct nvm_geo *geo = &dev->geo;
1748 struct pblk_lun *rlun; 1748 struct pblk_lun *rlun;
1749 int nr_luns = geo->nr_luns; 1749 int nr_luns = geo->all_luns;
1750 int bit = -1; 1750 int bit = -1;
1751 1751
1752 while ((bit = find_next_bit(lun_bitmap, nr_luns, bit + 1)) < nr_luns) { 1752 while ((bit = find_next_bit(lun_bitmap, nr_luns, bit + 1)) < nr_luns) {
diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c
index 695826a06b5d..d13bb51f0e2f 100644
--- a/drivers/lightnvm/pblk-init.c
+++ b/drivers/lightnvm/pblk-init.c
@@ -169,8 +169,8 @@ static int pblk_set_ppaf(struct pblk *pblk)
169 } 169 }
170 ppaf.ch_len = power_len; 170 ppaf.ch_len = power_len;
171 171
172 power_len = get_count_order(geo->luns_per_chnl); 172 power_len = get_count_order(geo->nr_luns);
173 if (1 << power_len != geo->luns_per_chnl) { 173 if (1 << power_len != geo->nr_luns) {
174 pr_err("pblk: supports only power-of-two LUN config.\n"); 174 pr_err("pblk: supports only power-of-two LUN config.\n");
175 return -EINVAL; 175 return -EINVAL;
176 } 176 }
@@ -254,7 +254,7 @@ static int pblk_core_init(struct pblk *pblk)
254 struct nvm_geo *geo = &dev->geo; 254 struct nvm_geo *geo = &dev->geo;
255 255
256 pblk->pgs_in_buffer = NVM_MEM_PAGE_WRITE * geo->sec_per_pg * 256 pblk->pgs_in_buffer = NVM_MEM_PAGE_WRITE * geo->sec_per_pg *
257 geo->nr_planes * geo->nr_luns; 257 geo->nr_planes * geo->all_luns;
258 258
259 if (pblk_init_global_caches(pblk)) 259 if (pblk_init_global_caches(pblk))
260 return -ENOMEM; 260 return -ENOMEM;
@@ -270,21 +270,22 @@ static int pblk_core_init(struct pblk *pblk)
270 if (!pblk->gen_ws_pool) 270 if (!pblk->gen_ws_pool)
271 goto free_page_bio_pool; 271 goto free_page_bio_pool;
272 272
273 pblk->rec_pool = mempool_create_slab_pool(geo->nr_luns, pblk_rec_cache); 273 pblk->rec_pool = mempool_create_slab_pool(geo->all_luns,
274 pblk_rec_cache);
274 if (!pblk->rec_pool) 275 if (!pblk->rec_pool)
275 goto free_gen_ws_pool; 276 goto free_gen_ws_pool;
276 277
277 pblk->r_rq_pool = mempool_create_slab_pool(geo->nr_luns, 278 pblk->r_rq_pool = mempool_create_slab_pool(geo->all_luns,
278 pblk_g_rq_cache); 279 pblk_g_rq_cache);
279 if (!pblk->r_rq_pool) 280 if (!pblk->r_rq_pool)
280 goto free_rec_pool; 281 goto free_rec_pool;
281 282
282 pblk->e_rq_pool = mempool_create_slab_pool(geo->nr_luns, 283 pblk->e_rq_pool = mempool_create_slab_pool(geo->all_luns,
283 pblk_g_rq_cache); 284 pblk_g_rq_cache);
284 if (!pblk->e_rq_pool) 285 if (!pblk->e_rq_pool)
285 goto free_r_rq_pool; 286 goto free_r_rq_pool;
286 287
287 pblk->w_rq_pool = mempool_create_slab_pool(geo->nr_luns, 288 pblk->w_rq_pool = mempool_create_slab_pool(geo->all_luns,
288 pblk_w_rq_cache); 289 pblk_w_rq_cache);
289 if (!pblk->w_rq_pool) 290 if (!pblk->w_rq_pool)
290 goto free_e_rq_pool; 291 goto free_e_rq_pool;
@@ -409,7 +410,7 @@ static int pblk_bb_discovery(struct nvm_tgt_dev *dev, struct pblk_lun *rlun)
409 u8 *blks; 410 u8 *blks;
410 int nr_blks, ret; 411 int nr_blks, ret;
411 412
412 nr_blks = geo->blks_per_lun * geo->plane_mode; 413 nr_blks = geo->nr_chks * geo->plane_mode;
413 blks = kmalloc(nr_blks, GFP_KERNEL); 414 blks = kmalloc(nr_blks, GFP_KERNEL);
414 if (!blks) 415 if (!blks)
415 return -ENOMEM; 416 return -ENOMEM;
@@ -482,20 +483,21 @@ static int pblk_luns_init(struct pblk *pblk, struct ppa_addr *luns)
482 int i, ret; 483 int i, ret;
483 484
484 /* TODO: Implement unbalanced LUN support */ 485 /* TODO: Implement unbalanced LUN support */
485 if (geo->luns_per_chnl < 0) { 486 if (geo->nr_luns < 0) {
486 pr_err("pblk: unbalanced LUN config.\n"); 487 pr_err("pblk: unbalanced LUN config.\n");
487 return -EINVAL; 488 return -EINVAL;
488 } 489 }
489 490
490 pblk->luns = kcalloc(geo->nr_luns, sizeof(struct pblk_lun), GFP_KERNEL); 491 pblk->luns = kcalloc(geo->all_luns, sizeof(struct pblk_lun),
492 GFP_KERNEL);
491 if (!pblk->luns) 493 if (!pblk->luns)
492 return -ENOMEM; 494 return -ENOMEM;
493 495
494 for (i = 0; i < geo->nr_luns; i++) { 496 for (i = 0; i < geo->all_luns; i++) {
495 /* Stripe across channels */ 497 /* Stripe across channels */
496 int ch = i % geo->nr_chnls; 498 int ch = i % geo->nr_chnls;
497 int lun_raw = i / geo->nr_chnls; 499 int lun_raw = i / geo->nr_chnls;
498 int lunid = lun_raw + ch * geo->luns_per_chnl; 500 int lunid = lun_raw + ch * geo->nr_luns;
499 501
500 rlun = &pblk->luns[i]; 502 rlun = &pblk->luns[i];
501 rlun->bppa = luns[lunid]; 503 rlun->bppa = luns[lunid];
@@ -590,8 +592,8 @@ static void pblk_set_provision(struct pblk *pblk, long nr_free_blks)
590 * on user capacity consider only provisioned blocks 592 * on user capacity consider only provisioned blocks
591 */ 593 */
592 pblk->rl.total_blocks = nr_free_blks; 594 pblk->rl.total_blocks = nr_free_blks;
593 pblk->rl.nr_secs = nr_free_blks * geo->sec_per_blk; 595 pblk->rl.nr_secs = nr_free_blks * geo->sec_per_chk;
594 pblk->capacity = provisioned * geo->sec_per_blk; 596 pblk->capacity = provisioned * geo->sec_per_chk;
595 atomic_set(&pblk->rl.free_blocks, nr_free_blks); 597 atomic_set(&pblk->rl.free_blocks, nr_free_blks);
596} 598}
597 599
@@ -683,7 +685,7 @@ static int pblk_lines_init(struct pblk *pblk)
683 int i, ret; 685 int i, ret;
684 686
685 pblk->min_write_pgs = geo->sec_per_pl * (geo->sec_size / PAGE_SIZE); 687 pblk->min_write_pgs = geo->sec_per_pl * (geo->sec_size / PAGE_SIZE);
686 max_write_ppas = pblk->min_write_pgs * geo->nr_luns; 688 max_write_ppas = pblk->min_write_pgs * geo->all_luns;
687 pblk->max_write_pgs = (max_write_ppas < nvm_max_phys_sects(dev)) ? 689 pblk->max_write_pgs = (max_write_ppas < nvm_max_phys_sects(dev)) ?
688 max_write_ppas : nvm_max_phys_sects(dev); 690 max_write_ppas : nvm_max_phys_sects(dev);
689 pblk_set_sec_per_write(pblk, pblk->min_write_pgs); 691 pblk_set_sec_per_write(pblk, pblk->min_write_pgs);
@@ -693,26 +695,26 @@ static int pblk_lines_init(struct pblk *pblk)
693 return -EINVAL; 695 return -EINVAL;
694 } 696 }
695 697
696 div_u64_rem(geo->sec_per_blk, pblk->min_write_pgs, &mod); 698 div_u64_rem(geo->sec_per_chk, pblk->min_write_pgs, &mod);
697 if (mod) { 699 if (mod) {
698 pr_err("pblk: bad configuration of sectors/pages\n"); 700 pr_err("pblk: bad configuration of sectors/pages\n");
699 return -EINVAL; 701 return -EINVAL;
700 } 702 }
701 703
702 l_mg->nr_lines = geo->blks_per_lun; 704 l_mg->nr_lines = geo->nr_chks;
703 l_mg->log_line = l_mg->data_line = NULL; 705 l_mg->log_line = l_mg->data_line = NULL;
704 l_mg->l_seq_nr = l_mg->d_seq_nr = 0; 706 l_mg->l_seq_nr = l_mg->d_seq_nr = 0;
705 l_mg->nr_free_lines = 0; 707 l_mg->nr_free_lines = 0;
706 bitmap_zero(&l_mg->meta_bitmap, PBLK_DATA_LINES); 708 bitmap_zero(&l_mg->meta_bitmap, PBLK_DATA_LINES);
707 709
708 lm->sec_per_line = geo->sec_per_blk * geo->nr_luns; 710 lm->sec_per_line = geo->sec_per_chk * geo->all_luns;
709 lm->blk_per_line = geo->nr_luns; 711 lm->blk_per_line = geo->all_luns;
710 lm->blk_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long); 712 lm->blk_bitmap_len = BITS_TO_LONGS(geo->all_luns) * sizeof(long);
711 lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long); 713 lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long);
712 lm->lun_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long); 714 lm->lun_bitmap_len = BITS_TO_LONGS(geo->all_luns) * sizeof(long);
713 lm->mid_thrs = lm->sec_per_line / 2; 715 lm->mid_thrs = lm->sec_per_line / 2;
714 lm->high_thrs = lm->sec_per_line / 4; 716 lm->high_thrs = lm->sec_per_line / 4;
715 lm->meta_distance = (geo->nr_luns / 2) * pblk->min_write_pgs; 717 lm->meta_distance = (geo->all_luns / 2) * pblk->min_write_pgs;
716 718
717 /* Calculate necessary pages for smeta. See comment over struct 719 /* Calculate necessary pages for smeta. See comment over struct
718 * line_smeta definition 720 * line_smeta definition
@@ -742,12 +744,12 @@ add_emeta_page:
742 goto add_emeta_page; 744 goto add_emeta_page;
743 } 745 }
744 746
745 lm->emeta_bb = geo->nr_luns > i ? geo->nr_luns - i : 0; 747 lm->emeta_bb = geo->all_luns > i ? geo->all_luns - i : 0;
746 748
747 lm->min_blk_line = 1; 749 lm->min_blk_line = 1;
748 if (geo->nr_luns > 1) 750 if (geo->all_luns > 1)
749 lm->min_blk_line += DIV_ROUND_UP(lm->smeta_sec + 751 lm->min_blk_line += DIV_ROUND_UP(lm->smeta_sec +
750 lm->emeta_sec[0], geo->sec_per_blk); 752 lm->emeta_sec[0], geo->sec_per_chk);
751 753
752 if (lm->min_blk_line > lm->blk_per_line) { 754 if (lm->min_blk_line > lm->blk_per_line) {
753 pr_err("pblk: config. not supported. Min. LUN in line:%d\n", 755 pr_err("pblk: config. not supported. Min. LUN in line:%d\n",
@@ -772,7 +774,7 @@ add_emeta_page:
772 goto fail_free_bb_template; 774 goto fail_free_bb_template;
773 } 775 }
774 776
775 bb_distance = (geo->nr_luns) * geo->sec_per_pl; 777 bb_distance = (geo->all_luns) * geo->sec_per_pl;
776 for (i = 0; i < lm->sec_per_line; i += bb_distance) 778 for (i = 0; i < lm->sec_per_line; i += bb_distance)
777 bitmap_set(l_mg->bb_template, i, geo->sec_per_pl); 779 bitmap_set(l_mg->bb_template, i, geo->sec_per_pl);
778 780
@@ -844,7 +846,7 @@ add_emeta_page:
844 pblk_set_provision(pblk, nr_free_blks); 846 pblk_set_provision(pblk, nr_free_blks);
845 847
846 /* Cleanup per-LUN bad block lists - managed within lines on run-time */ 848 /* Cleanup per-LUN bad block lists - managed within lines on run-time */
847 for (i = 0; i < geo->nr_luns; i++) 849 for (i = 0; i < geo->all_luns; i++)
848 kfree(pblk->luns[i].bb_list); 850 kfree(pblk->luns[i].bb_list);
849 851
850 return 0; 852 return 0;
@@ -858,7 +860,7 @@ fail_free_bb_template:
858fail_free_meta: 860fail_free_meta:
859 pblk_line_meta_free(pblk); 861 pblk_line_meta_free(pblk);
860fail: 862fail:
861 for (i = 0; i < geo->nr_luns; i++) 863 for (i = 0; i < geo->all_luns; i++)
862 kfree(pblk->luns[i].bb_list); 864 kfree(pblk->luns[i].bb_list);
863 865
864 return ret; 866 return ret;
@@ -1041,13 +1043,13 @@ static void *pblk_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
1041 1043
1042 blk_queue_write_cache(tqueue, true, false); 1044 blk_queue_write_cache(tqueue, true, false);
1043 1045
1044 tqueue->limits.discard_granularity = geo->pgs_per_blk * geo->pfpg_size; 1046 tqueue->limits.discard_granularity = geo->sec_per_chk * geo->sec_size;
1045 tqueue->limits.discard_alignment = 0; 1047 tqueue->limits.discard_alignment = 0;
1046 blk_queue_max_discard_sectors(tqueue, UINT_MAX >> 9); 1048 blk_queue_max_discard_sectors(tqueue, UINT_MAX >> 9);
1047 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, tqueue); 1049 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, tqueue);
1048 1050
1049 pr_info("pblk init: luns:%u, lines:%d, secs:%llu, buf entries:%u\n", 1051 pr_info("pblk init: luns:%u, lines:%d, secs:%llu, buf entries:%u\n",
1050 geo->nr_luns, pblk->l_mg.nr_lines, 1052 geo->all_luns, pblk->l_mg.nr_lines,
1051 (unsigned long long)pblk->rl.nr_secs, 1053 (unsigned long long)pblk->rl.nr_secs,
1052 pblk->rwb.nr_entries); 1054 pblk->rwb.nr_entries);
1053 1055
diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c
index eadb3eb5d4dc..ceec12d26643 100644
--- a/drivers/lightnvm/pblk-recovery.c
+++ b/drivers/lightnvm/pblk-recovery.c
@@ -188,7 +188,7 @@ static int pblk_calc_sec_in_line(struct pblk *pblk, struct pblk_line *line)
188 int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line); 188 int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line);
189 189
190 return lm->sec_per_line - lm->smeta_sec - lm->emeta_sec[0] - 190 return lm->sec_per_line - lm->smeta_sec - lm->emeta_sec[0] -
191 nr_bb * geo->sec_per_blk; 191 nr_bb * geo->sec_per_chk;
192} 192}
193 193
194struct pblk_recov_alloc { 194struct pblk_recov_alloc {
diff --git a/drivers/lightnvm/pblk-sysfs.c b/drivers/lightnvm/pblk-sysfs.c
index cd49e8875d4e..5cee2ac49c72 100644
--- a/drivers/lightnvm/pblk-sysfs.c
+++ b/drivers/lightnvm/pblk-sysfs.c
@@ -28,7 +28,7 @@ static ssize_t pblk_sysfs_luns_show(struct pblk *pblk, char *page)
28 ssize_t sz = 0; 28 ssize_t sz = 0;
29 int i; 29 int i;
30 30
31 for (i = 0; i < geo->nr_luns; i++) { 31 for (i = 0; i < geo->all_luns; i++) {
32 int active = 1; 32 int active = 1;
33 33
34 rlun = &pblk->luns[i]; 34 rlun = &pblk->luns[i];
@@ -238,7 +238,7 @@ static ssize_t pblk_sysfs_lines(struct pblk *pblk, char *page)
238 238
239 sz = snprintf(page, PAGE_SIZE - sz, 239 sz = snprintf(page, PAGE_SIZE - sz,
240 "line: nluns:%d, nblks:%d, nsecs:%d\n", 240 "line: nluns:%d, nblks:%d, nsecs:%d\n",
241 geo->nr_luns, lm->blk_per_line, lm->sec_per_line); 241 geo->all_luns, lm->blk_per_line, lm->sec_per_line);
242 242
243 sz += snprintf(page + sz, PAGE_SIZE - sz, 243 sz += snprintf(page + sz, PAGE_SIZE - sz,
244 "lines:d:%d,l:%d-f:%d,m:%d/%d,c:%d,b:%d,co:%d(d:%d,l:%d)t:%d\n", 244 "lines:d:%d,l:%d-f:%d,m:%d/%d,c:%d,b:%d,co:%d(d:%d,l:%d)t:%d\n",
@@ -287,7 +287,7 @@ static ssize_t pblk_sysfs_lines_info(struct pblk *pblk, char *page)
287 "blk_line:%d, sec_line:%d, sec_blk:%d\n", 287 "blk_line:%d, sec_line:%d, sec_blk:%d\n",
288 lm->blk_per_line, 288 lm->blk_per_line,
289 lm->sec_per_line, 289 lm->sec_per_line,
290 geo->sec_per_blk); 290 geo->sec_per_chk);
291 291
292 return sz; 292 return sz;
293} 293}
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index 59a64d461a5d..c150728c3b49 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -907,7 +907,7 @@ static inline int pblk_pad_distance(struct pblk *pblk)
907 struct nvm_tgt_dev *dev = pblk->dev; 907 struct nvm_tgt_dev *dev = pblk->dev;
908 struct nvm_geo *geo = &dev->geo; 908 struct nvm_geo *geo = &dev->geo;
909 909
910 return NVM_MEM_PAGE_WRITE * geo->nr_luns * geo->sec_per_pl; 910 return NVM_MEM_PAGE_WRITE * geo->all_luns * geo->sec_per_pl;
911} 911}
912 912
913static inline int pblk_dev_ppa_to_line(struct ppa_addr p) 913static inline int pblk_dev_ppa_to_line(struct ppa_addr p)
@@ -1212,10 +1212,10 @@ static inline int pblk_boundary_ppa_checks(struct nvm_tgt_dev *tgt_dev,
1212 1212
1213 if (!ppa->c.is_cached && 1213 if (!ppa->c.is_cached &&
1214 ppa->g.ch < geo->nr_chnls && 1214 ppa->g.ch < geo->nr_chnls &&
1215 ppa->g.lun < geo->luns_per_chnl && 1215 ppa->g.lun < geo->nr_luns &&
1216 ppa->g.pl < geo->nr_planes && 1216 ppa->g.pl < geo->nr_planes &&
1217 ppa->g.blk < geo->blks_per_lun && 1217 ppa->g.blk < geo->nr_chks &&
1218 ppa->g.pg < geo->pgs_per_blk && 1218 ppa->g.pg < geo->ws_per_chk &&
1219 ppa->g.sec < geo->sec_per_pg) 1219 ppa->g.sec < geo->sec_per_pg)
1220 continue; 1220 continue;
1221 1221