Re: [PATCH 1/5] lightnvm: pblk: Helpers for OOB metadata

2018-06-19 Thread Javier Gonzalez
> 
> On 18 Jun 2018, at 22.53, Igor Konopko  wrote:
> 
> 
> 
> On 18.06.2018 07:23, Javier Gonzalez wrote:
>>> On 16 Jun 2018, at 00.27, Igor Konopko  wrote:
>>> 
>>> Currently pblk assumes that size of OOB metadata on drive is always
>>> equal to size of pblk_sec_meta struct. This commit add helpers which will
>>> allow to handle different sizes of OOB metadata on drive.
>>> 
>>> Signed-off-by: Igor Konopko 
>>> ---
>>> drivers/lightnvm/pblk-core.c | 10 +
>>> drivers/lightnvm/pblk-map.c  | 21 ---
>>> drivers/lightnvm/pblk-read.c | 45 
>>> +---
>>> drivers/lightnvm/pblk-recovery.c | 24 -
>>> drivers/lightnvm/pblk.h  | 29 ++
>>> 5 files changed, 91 insertions(+), 38 deletions(-)
>>> 
>>> diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
>>> index 66ab1036f2fb..8a0ac466872f 100644
>>> --- a/drivers/lightnvm/pblk-core.c
>>> +++ b/drivers/lightnvm/pblk-core.c
>>> @@ -685,7 +685,7 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
>>> struct pblk_line *line,
>>> rqd.nr_ppas = rq_ppas;
>>> 
>>> if (dir == PBLK_WRITE) {
>>> -   struct pblk_sec_meta *meta_list = rqd.meta_list;
>>> +   void *meta_list = rqd.meta_list;
>>> 
>>> rqd.flags = pblk_set_progr_mode(pblk, PBLK_WRITE);
>>> for (i = 0; i < rqd.nr_ppas; ) {
>>> @@ -693,7 +693,8 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
>>> struct pblk_line *line,
>>> paddr = __pblk_alloc_page(pblk, line, min);
>>> spin_unlock(>lock);
>>> for (j = 0; j < min; j++, i++, paddr++) {
>>> -   meta_list[i].lba = cpu_to_le64(ADDR_EMPTY);
>>> +   pblk_get_meta_at(pblk, meta_list, i)->lba =
>>> +   cpu_to_le64(ADDR_EMPTY);
>>> rqd.ppa_list[i] =
>>> addr_to_gen_ppa(pblk, paddr, id);
>>> }
>>> @@ -825,14 +826,15 @@ static int pblk_line_submit_smeta_io(struct pblk 
>>> *pblk, struct pblk_line *line,
>>> rqd.nr_ppas = lm->smeta_sec;
>>> 
>>> for (i = 0; i < lm->smeta_sec; i++, paddr++) {
>>> -   struct pblk_sec_meta *meta_list = rqd.meta_list;
>>> +   void *meta_list = rqd.meta_list;
>>> 
>>> rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
>>> 
>>> if (dir == PBLK_WRITE) {
>>> __le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
>>> 
>>> -   meta_list[i].lba = lba_list[paddr] = addr_empty;
>>> +   pblk_get_meta_at(pblk, meta_list, i)->lba =
>>> +   lba_list[paddr] = addr_empty;
>>> }
>>> }
>>> 
>>> diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c
>>> index 953ca31dda68..92c40b546c4e 100644
>>> --- a/drivers/lightnvm/pblk-map.c
>>> +++ b/drivers/lightnvm/pblk-map.c
>>> @@ -21,7 +21,7 @@
>>> static int pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
>>>   struct ppa_addr *ppa_list,
>>>   unsigned long *lun_bitmap,
>>> - struct pblk_sec_meta *meta_list,
>>> + void *meta_list,
>>>   unsigned int valid_secs)
>>> {
>>> struct pblk_line *line = pblk_line_get_data(pblk);
>>> @@ -67,14 +67,17 @@ static int pblk_map_page_data(struct pblk *pblk, 
>>> unsigned int sentry,
>>> kref_get(>ref);
>>> w_ctx = pblk_rb_w_ctx(>rwb, sentry + i);
>>> w_ctx->ppa = ppa_list[i];
>>> -   meta_list[i].lba = cpu_to_le64(w_ctx->lba);
>>> +   pblk_get_meta_at(pblk, meta_list, i)->lba =
>>> +   cpu_to_le64(w_ctx->lba);
>>> lba_list[paddr] = cpu_to_le64(w_ctx->lba);
>>> if (lba_list[paddr] != addr_empty)
>>> line->nr_valid_lbas++;
>>> else
>>> atomic64_inc(>pad_wa);
>>> } else {
>>> -   lba_list[paddr] = meta_list[i].lba = addr_empty;
>>> +   lba_list[paddr] =
>>> +   pblk_get_meta_at(pblk, meta_list, i)->lba =
>>> +   addr_empty;
>>> __pblk_map_invalidate(pblk, line, paddr);
>>> }
>>> }
>>> @@ -87,7 +90,7 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
>>> unsigned int sentry,
>>>  unsigned long *lun_bitmap, unsigned int valid_secs,
>>>  unsigned int off)
>>> {
>>> -   struct pblk_sec_meta *meta_list = rqd->meta_list;
>>> +   void *meta_list = rqd->meta_list;
>>> unsigned int map_secs;
>>> int min = pblk->min_write_pgs;
>>> int i;
>>> @@ -95,7 +98,9 @@ void 

Re: [PATCH 1/5] lightnvm: pblk: Helpers for OOB metadata

2018-06-18 Thread Igor Konopko




On 18.06.2018 07:23, Javier Gonzalez wrote:



On 16 Jun 2018, at 00.27, Igor Konopko  wrote:

Currently pblk assumes that size of OOB metadata on drive is always
equal to size of pblk_sec_meta struct. This commit add helpers which will
allow to handle different sizes of OOB metadata on drive.

Signed-off-by: Igor Konopko 
---
drivers/lightnvm/pblk-core.c | 10 +
drivers/lightnvm/pblk-map.c  | 21 ---
drivers/lightnvm/pblk-read.c | 45 +---
drivers/lightnvm/pblk-recovery.c | 24 -
drivers/lightnvm/pblk.h  | 29 ++
5 files changed, 91 insertions(+), 38 deletions(-)

diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 66ab1036f2fb..8a0ac466872f 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -685,7 +685,7 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
struct pblk_line *line,
rqd.nr_ppas = rq_ppas;

if (dir == PBLK_WRITE) {
-   struct pblk_sec_meta *meta_list = rqd.meta_list;
+   void *meta_list = rqd.meta_list;

rqd.flags = pblk_set_progr_mode(pblk, PBLK_WRITE);
for (i = 0; i < rqd.nr_ppas; ) {
@@ -693,7 +693,8 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
struct pblk_line *line,
paddr = __pblk_alloc_page(pblk, line, min);
spin_unlock(>lock);
for (j = 0; j < min; j++, i++, paddr++) {
-   meta_list[i].lba = cpu_to_le64(ADDR_EMPTY);
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   cpu_to_le64(ADDR_EMPTY);
rqd.ppa_list[i] =
addr_to_gen_ppa(pblk, paddr, id);
}
@@ -825,14 +826,15 @@ static int pblk_line_submit_smeta_io(struct pblk *pblk, 
struct pblk_line *line,
rqd.nr_ppas = lm->smeta_sec;

for (i = 0; i < lm->smeta_sec; i++, paddr++) {
-   struct pblk_sec_meta *meta_list = rqd.meta_list;
+   void *meta_list = rqd.meta_list;

rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);

if (dir == PBLK_WRITE) {
__le64 addr_empty = cpu_to_le64(ADDR_EMPTY);

-   meta_list[i].lba = lba_list[paddr] = addr_empty;
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   lba_list[paddr] = addr_empty;
}
}

diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c
index 953ca31dda68..92c40b546c4e 100644
--- a/drivers/lightnvm/pblk-map.c
+++ b/drivers/lightnvm/pblk-map.c
@@ -21,7 +21,7 @@
static int pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
  struct ppa_addr *ppa_list,
  unsigned long *lun_bitmap,
- struct pblk_sec_meta *meta_list,
+ void *meta_list,
  unsigned int valid_secs)
{
struct pblk_line *line = pblk_line_get_data(pblk);
@@ -67,14 +67,17 @@ static int pblk_map_page_data(struct pblk *pblk, unsigned 
int sentry,
kref_get(>ref);
w_ctx = pblk_rb_w_ctx(>rwb, sentry + i);
w_ctx->ppa = ppa_list[i];
-   meta_list[i].lba = cpu_to_le64(w_ctx->lba);
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   cpu_to_le64(w_ctx->lba);
lba_list[paddr] = cpu_to_le64(w_ctx->lba);
if (lba_list[paddr] != addr_empty)
line->nr_valid_lbas++;
else
atomic64_inc(>pad_wa);
} else {
-   lba_list[paddr] = meta_list[i].lba = addr_empty;
+   lba_list[paddr] =
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   addr_empty;
__pblk_map_invalidate(pblk, line, paddr);
}
}
@@ -87,7 +90,7 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
unsigned int sentry,
 unsigned long *lun_bitmap, unsigned int valid_secs,
 unsigned int off)
{
-   struct pblk_sec_meta *meta_list = rqd->meta_list;
+   void *meta_list = rqd->meta_list;
unsigned int map_secs;
int min = pblk->min_write_pgs;
int i;
@@ -95,7 +98,9 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
unsigned int sentry,
for (i = off; i < rqd->nr_ppas; i += min) {
map_secs = (i + min > valid_secs) ? (valid_secs % min) : min;
if 

Re: [PATCH 1/5] lightnvm: pblk: Helpers for OOB metadata

2018-06-18 Thread Javier Gonzalez

> On 16 Jun 2018, at 00.27, Igor Konopko  wrote:
> 
> Currently pblk assumes that size of OOB metadata on drive is always
> equal to size of pblk_sec_meta struct. This commit add helpers which will
> allow to handle different sizes of OOB metadata on drive.
> 
> Signed-off-by: Igor Konopko 
> ---
> drivers/lightnvm/pblk-core.c | 10 +
> drivers/lightnvm/pblk-map.c  | 21 ---
> drivers/lightnvm/pblk-read.c | 45 +---
> drivers/lightnvm/pblk-recovery.c | 24 -
> drivers/lightnvm/pblk.h  | 29 ++
> 5 files changed, 91 insertions(+), 38 deletions(-)
> 
> diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
> index 66ab1036f2fb..8a0ac466872f 100644
> --- a/drivers/lightnvm/pblk-core.c
> +++ b/drivers/lightnvm/pblk-core.c
> @@ -685,7 +685,7 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
> struct pblk_line *line,
>   rqd.nr_ppas = rq_ppas;
> 
>   if (dir == PBLK_WRITE) {
> - struct pblk_sec_meta *meta_list = rqd.meta_list;
> + void *meta_list = rqd.meta_list;
> 
>   rqd.flags = pblk_set_progr_mode(pblk, PBLK_WRITE);
>   for (i = 0; i < rqd.nr_ppas; ) {
> @@ -693,7 +693,8 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
> struct pblk_line *line,
>   paddr = __pblk_alloc_page(pblk, line, min);
>   spin_unlock(>lock);
>   for (j = 0; j < min; j++, i++, paddr++) {
> - meta_list[i].lba = cpu_to_le64(ADDR_EMPTY);
> + pblk_get_meta_at(pblk, meta_list, i)->lba =
> + cpu_to_le64(ADDR_EMPTY);
>   rqd.ppa_list[i] =
>   addr_to_gen_ppa(pblk, paddr, id);
>   }
> @@ -825,14 +826,15 @@ static int pblk_line_submit_smeta_io(struct pblk *pblk, 
> struct pblk_line *line,
>   rqd.nr_ppas = lm->smeta_sec;
> 
>   for (i = 0; i < lm->smeta_sec; i++, paddr++) {
> - struct pblk_sec_meta *meta_list = rqd.meta_list;
> + void *meta_list = rqd.meta_list;
> 
>   rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
> 
>   if (dir == PBLK_WRITE) {
>   __le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
> 
> - meta_list[i].lba = lba_list[paddr] = addr_empty;
> + pblk_get_meta_at(pblk, meta_list, i)->lba =
> + lba_list[paddr] = addr_empty;
>   }
>   }
> 
> diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c
> index 953ca31dda68..92c40b546c4e 100644
> --- a/drivers/lightnvm/pblk-map.c
> +++ b/drivers/lightnvm/pblk-map.c
> @@ -21,7 +21,7 @@
> static int pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
> struct ppa_addr *ppa_list,
> unsigned long *lun_bitmap,
> -   struct pblk_sec_meta *meta_list,
> +   void *meta_list,
> unsigned int valid_secs)
> {
>   struct pblk_line *line = pblk_line_get_data(pblk);
> @@ -67,14 +67,17 @@ static int pblk_map_page_data(struct pblk *pblk, unsigned 
> int sentry,
>   kref_get(>ref);
>   w_ctx = pblk_rb_w_ctx(>rwb, sentry + i);
>   w_ctx->ppa = ppa_list[i];
> - meta_list[i].lba = cpu_to_le64(w_ctx->lba);
> + pblk_get_meta_at(pblk, meta_list, i)->lba =
> + cpu_to_le64(w_ctx->lba);
>   lba_list[paddr] = cpu_to_le64(w_ctx->lba);
>   if (lba_list[paddr] != addr_empty)
>   line->nr_valid_lbas++;
>   else
>   atomic64_inc(>pad_wa);
>   } else {
> - lba_list[paddr] = meta_list[i].lba = addr_empty;
> + lba_list[paddr] =
> + pblk_get_meta_at(pblk, meta_list, i)->lba =
> + addr_empty;
>   __pblk_map_invalidate(pblk, line, paddr);
>   }
>   }
> @@ -87,7 +90,7 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
> unsigned int sentry,
>unsigned long *lun_bitmap, unsigned int valid_secs,
>unsigned int off)
> {
> - struct pblk_sec_meta *meta_list = rqd->meta_list;
> + void *meta_list = rqd->meta_list;
>   unsigned int map_secs;
>   int min = pblk->min_write_pgs;
>   int i;
> @@ -95,7 +98,9 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
> unsigned int sentry,
>   for (i = off; i < rqd->nr_ppas; i += min) {
>   map_secs = (i + min > valid_secs) ? (valid_secs % min) : 

Re: [PATCH 1/5] lightnvm: pblk: Helpers for OOB metadata

2018-06-16 Thread Matias Bjørling

On 06/16/2018 12:27 AM, Igor Konopko wrote:

Currently pblk assumes that size of OOB metadata on drive is always
equal to size of pblk_sec_meta struct. This commit add helpers which will
allow to handle different sizes of OOB metadata on drive.

Signed-off-by: Igor Konopko 
---
  drivers/lightnvm/pblk-core.c | 10 +
  drivers/lightnvm/pblk-map.c  | 21 ---
  drivers/lightnvm/pblk-read.c | 45 +---
  drivers/lightnvm/pblk-recovery.c | 24 -
  drivers/lightnvm/pblk.h  | 29 ++
  5 files changed, 91 insertions(+), 38 deletions(-)

diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 66ab1036f2fb..8a0ac466872f 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -685,7 +685,7 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
struct pblk_line *line,
rqd.nr_ppas = rq_ppas;
  
  	if (dir == PBLK_WRITE) {

-   struct pblk_sec_meta *meta_list = rqd.meta_list;
+   void *meta_list = rqd.meta_list;
  
  		rqd.flags = pblk_set_progr_mode(pblk, PBLK_WRITE);

for (i = 0; i < rqd.nr_ppas; ) {
@@ -693,7 +693,8 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
struct pblk_line *line,
paddr = __pblk_alloc_page(pblk, line, min);
spin_unlock(>lock);
for (j = 0; j < min; j++, i++, paddr++) {
-   meta_list[i].lba = cpu_to_le64(ADDR_EMPTY);
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   cpu_to_le64(ADDR_EMPTY);
rqd.ppa_list[i] =
addr_to_gen_ppa(pblk, paddr, id);
}
@@ -825,14 +826,15 @@ static int pblk_line_submit_smeta_io(struct pblk *pblk, 
struct pblk_line *line,
rqd.nr_ppas = lm->smeta_sec;
  
  	for (i = 0; i < lm->smeta_sec; i++, paddr++) {

-   struct pblk_sec_meta *meta_list = rqd.meta_list;
+   void *meta_list = rqd.meta_list;
  
  		rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
  
  		if (dir == PBLK_WRITE) {

__le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
  
-			meta_list[i].lba = lba_list[paddr] = addr_empty;

+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   lba_list[paddr] = addr_empty;
}
}
  
diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c

index 953ca31dda68..92c40b546c4e 100644
--- a/drivers/lightnvm/pblk-map.c
+++ b/drivers/lightnvm/pblk-map.c
@@ -21,7 +21,7 @@
  static int pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
  struct ppa_addr *ppa_list,
  unsigned long *lun_bitmap,
- struct pblk_sec_meta *meta_list,
+ void *meta_list,
  unsigned int valid_secs)
  {
struct pblk_line *line = pblk_line_get_data(pblk);
@@ -67,14 +67,17 @@ static int pblk_map_page_data(struct pblk *pblk, unsigned 
int sentry,
kref_get(>ref);
w_ctx = pblk_rb_w_ctx(>rwb, sentry + i);
w_ctx->ppa = ppa_list[i];
-   meta_list[i].lba = cpu_to_le64(w_ctx->lba);
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   cpu_to_le64(w_ctx->lba);
lba_list[paddr] = cpu_to_le64(w_ctx->lba);
if (lba_list[paddr] != addr_empty)
line->nr_valid_lbas++;
else
atomic64_inc(>pad_wa);
} else {
-   lba_list[paddr] = meta_list[i].lba = addr_empty;
+   lba_list[paddr] =
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   addr_empty;
__pblk_map_invalidate(pblk, line, paddr);
}
}
@@ -87,7 +90,7 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
unsigned int sentry,
 unsigned long *lun_bitmap, unsigned int valid_secs,
 unsigned int off)
  {
-   struct pblk_sec_meta *meta_list = rqd->meta_list;
+   void *meta_list = rqd->meta_list;
unsigned int map_secs;
int min = pblk->min_write_pgs;
int i;
@@ -95,7 +98,9 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
unsigned int sentry,
for (i = off; i < rqd->nr_ppas; i += min) {
map_secs = (i + min > valid_secs) ? (valid_secs % min) : min;
if (pblk_map_page_data(pblk, sentry + i, >ppa_list[i],
-   

[PATCH 1/5] lightnvm: pblk: Helpers for OOB metadata

2018-06-15 Thread Igor Konopko
Currently pblk assumes that size of OOB metadata on drive is always
equal to size of pblk_sec_meta struct. This commit add helpers which will
allow to handle different sizes of OOB metadata on drive.

Signed-off-by: Igor Konopko 
---
 drivers/lightnvm/pblk-core.c | 10 +
 drivers/lightnvm/pblk-map.c  | 21 ---
 drivers/lightnvm/pblk-read.c | 45 +---
 drivers/lightnvm/pblk-recovery.c | 24 -
 drivers/lightnvm/pblk.h  | 29 ++
 5 files changed, 91 insertions(+), 38 deletions(-)

diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 66ab1036f2fb..8a0ac466872f 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -685,7 +685,7 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
struct pblk_line *line,
rqd.nr_ppas = rq_ppas;
 
if (dir == PBLK_WRITE) {
-   struct pblk_sec_meta *meta_list = rqd.meta_list;
+   void *meta_list = rqd.meta_list;
 
rqd.flags = pblk_set_progr_mode(pblk, PBLK_WRITE);
for (i = 0; i < rqd.nr_ppas; ) {
@@ -693,7 +693,8 @@ static int pblk_line_submit_emeta_io(struct pblk *pblk, 
struct pblk_line *line,
paddr = __pblk_alloc_page(pblk, line, min);
spin_unlock(>lock);
for (j = 0; j < min; j++, i++, paddr++) {
-   meta_list[i].lba = cpu_to_le64(ADDR_EMPTY);
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   cpu_to_le64(ADDR_EMPTY);
rqd.ppa_list[i] =
addr_to_gen_ppa(pblk, paddr, id);
}
@@ -825,14 +826,15 @@ static int pblk_line_submit_smeta_io(struct pblk *pblk, 
struct pblk_line *line,
rqd.nr_ppas = lm->smeta_sec;
 
for (i = 0; i < lm->smeta_sec; i++, paddr++) {
-   struct pblk_sec_meta *meta_list = rqd.meta_list;
+   void *meta_list = rqd.meta_list;
 
rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
 
if (dir == PBLK_WRITE) {
__le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
 
-   meta_list[i].lba = lba_list[paddr] = addr_empty;
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   lba_list[paddr] = addr_empty;
}
}
 
diff --git a/drivers/lightnvm/pblk-map.c b/drivers/lightnvm/pblk-map.c
index 953ca31dda68..92c40b546c4e 100644
--- a/drivers/lightnvm/pblk-map.c
+++ b/drivers/lightnvm/pblk-map.c
@@ -21,7 +21,7 @@
 static int pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
  struct ppa_addr *ppa_list,
  unsigned long *lun_bitmap,
- struct pblk_sec_meta *meta_list,
+ void *meta_list,
  unsigned int valid_secs)
 {
struct pblk_line *line = pblk_line_get_data(pblk);
@@ -67,14 +67,17 @@ static int pblk_map_page_data(struct pblk *pblk, unsigned 
int sentry,
kref_get(>ref);
w_ctx = pblk_rb_w_ctx(>rwb, sentry + i);
w_ctx->ppa = ppa_list[i];
-   meta_list[i].lba = cpu_to_le64(w_ctx->lba);
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   cpu_to_le64(w_ctx->lba);
lba_list[paddr] = cpu_to_le64(w_ctx->lba);
if (lba_list[paddr] != addr_empty)
line->nr_valid_lbas++;
else
atomic64_inc(>pad_wa);
} else {
-   lba_list[paddr] = meta_list[i].lba = addr_empty;
+   lba_list[paddr] =
+   pblk_get_meta_at(pblk, meta_list, i)->lba =
+   addr_empty;
__pblk_map_invalidate(pblk, line, paddr);
}
}
@@ -87,7 +90,7 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
unsigned int sentry,
 unsigned long *lun_bitmap, unsigned int valid_secs,
 unsigned int off)
 {
-   struct pblk_sec_meta *meta_list = rqd->meta_list;
+   void *meta_list = rqd->meta_list;
unsigned int map_secs;
int min = pblk->min_write_pgs;
int i;
@@ -95,7 +98,9 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, 
unsigned int sentry,
for (i = off; i < rqd->nr_ppas; i += min) {
map_secs = (i + min > valid_secs) ? (valid_secs % min) : min;
if (pblk_map_page_data(pblk, sentry + i, >ppa_list[i],
-