summaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-map.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/lightnvm/pblk-map.c')
-rw-r--r--drivers/lightnvm/pblk-map.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c
index fddb924f6dde..6f3ecde2140f 100644
--- a/drivers/lightnvm/pblk-map.c
+++ b/drivers/lightnvm/pblk-map.c
@@ -25,16 +25,28 @@ static void pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
25 unsigned int valid_secs) 25 unsigned int valid_secs)
26{ 26{
27 struct pblk_line *line = pblk_line_get_data(pblk); 27 struct pblk_line *line = pblk_line_get_data(pblk);
28 struct pblk_emeta *emeta = line->emeta; 28 struct pblk_emeta *emeta;
29 struct pblk_w_ctx *w_ctx; 29 struct pblk_w_ctx *w_ctx;
30 __le64 *lba_list = emeta_to_lbas(pblk, emeta->buf); 30 __le64 *lba_list;
31 u64 paddr; 31 u64 paddr;
32 int nr_secs = pblk->min_write_pgs; 32 int nr_secs = pblk->min_write_pgs;
33 int i; 33 int i;
34 34
35 if (pblk_line_is_full(line)) {
36 struct pblk_line *prev_line = line;
37
38 line = pblk_line_replace_data(pblk);
39 pblk_line_close_meta(pblk, prev_line);
40 }
41
42 emeta = line->emeta;
43 lba_list = emeta_to_lbas(pblk, emeta->buf);
44
35 paddr = pblk_alloc_page(pblk, line, nr_secs); 45 paddr = pblk_alloc_page(pblk, line, nr_secs);
36 46
37 for (i = 0; i < nr_secs; i++, paddr++) { 47 for (i = 0; i < nr_secs; i++, paddr++) {
48 __le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
49
38 /* ppa to be sent to the device */ 50 /* ppa to be sent to the device */
39 ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id); 51 ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
40 52
@@ -51,22 +63,14 @@ static void pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
51 w_ctx->ppa = ppa_list[i]; 63 w_ctx->ppa = ppa_list[i];
52 meta_list[i].lba = cpu_to_le64(w_ctx->lba); 64 meta_list[i].lba = cpu_to_le64(w_ctx->lba);
53 lba_list[paddr] = cpu_to_le64(w_ctx->lba); 65 lba_list[paddr] = cpu_to_le64(w_ctx->lba);
54 line->nr_valid_lbas++; 66 if (lba_list[paddr] != addr_empty)
67 line->nr_valid_lbas++;
55 } else { 68 } else {
56 __le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
57
58 lba_list[paddr] = meta_list[i].lba = addr_empty; 69 lba_list[paddr] = meta_list[i].lba = addr_empty;
59 __pblk_map_invalidate(pblk, line, paddr); 70 __pblk_map_invalidate(pblk, line, paddr);
60 } 71 }
61 } 72 }
62 73
63 if (pblk_line_is_full(line)) {
64 struct pblk_line *prev_line = line;
65
66 pblk_line_replace_data(pblk);
67 pblk_line_close_meta(pblk, prev_line);
68 }
69
70 pblk_down_rq(pblk, ppa_list, nr_secs, lun_bitmap); 74 pblk_down_rq(pblk, ppa_list, nr_secs, lun_bitmap);
71} 75}
72 76