diff options
Diffstat (limited to 'drivers/lightnvm/pblk-map.c')
-rw-r--r-- | drivers/lightnvm/pblk-map.c | 28 |
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 | ||