Commit 06bc072b authored by Hans Holmberg's avatar Hans Holmberg Committed by Jens Axboe

lightnvm: pblk: refactor emeta consistency check

Currently pblk_recov_get_lba list does two separate things:
it checks the consistency of the emeta and extracts the lba list.

This patch separates the consistency check to make the code easier
to read and to prepare for version checks of the line emeta
persistent data format version.
Signed-off-by: default avatarHans Holmberg <hans.holmberg@cnexlabs.com>
Signed-off-by: default avatarJavier González <javier@cnexlabs.com>
Signed-off-by: default avatarMatias Bjørling <m@bjorling.me>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent d6d3ec2a
...@@ -169,7 +169,14 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work) ...@@ -169,7 +169,14 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
* the line untouched. TODO: Implement a recovery routine that scans and * the line untouched. TODO: Implement a recovery routine that scans and
* moves all sectors on the line. * moves all sectors on the line.
*/ */
lba_list = pblk_recov_get_lba_list(pblk, emeta_buf);
ret = pblk_recov_check_emeta(pblk, emeta_buf);
if (ret) {
pr_err("pblk: inconsistent emeta (line %d)\n", line->id);
goto fail_free_emeta;
}
lba_list = emeta_to_lbas(pblk, emeta_buf);
if (!lba_list) { if (!lba_list) {
pr_err("pblk: could not interpret emeta (line %d)\n", line->id); pr_err("pblk: could not interpret emeta (line %d)\n", line->id);
goto fail_free_emeta; goto fail_free_emeta;
......
...@@ -111,18 +111,18 @@ int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx, ...@@ -111,18 +111,18 @@ int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx,
return 0; return 0;
} }
__le64 *pblk_recov_get_lba_list(struct pblk *pblk, struct line_emeta *emeta_buf) int pblk_recov_check_emeta(struct pblk *pblk, struct line_emeta *emeta_buf)
{ {
u32 crc; u32 crc;
crc = pblk_calc_emeta_crc(pblk, emeta_buf); crc = pblk_calc_emeta_crc(pblk, emeta_buf);
if (le32_to_cpu(emeta_buf->crc) != crc) if (le32_to_cpu(emeta_buf->crc) != crc)
return NULL; return 1;
if (le32_to_cpu(emeta_buf->header.identifier) != PBLK_MAGIC) if (le32_to_cpu(emeta_buf->header.identifier) != PBLK_MAGIC)
return NULL; return 1;
return emeta_to_lbas(pblk, emeta_buf); return 0;
} }
static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line) static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line)
...@@ -137,7 +137,7 @@ static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line) ...@@ -137,7 +137,7 @@ static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line)
u64 nr_valid_lbas, nr_lbas = 0; u64 nr_valid_lbas, nr_lbas = 0;
u64 i; u64 i;
lba_list = pblk_recov_get_lba_list(pblk, emeta_buf); lba_list = emeta_to_lbas(pblk, emeta_buf);
if (!lba_list) if (!lba_list)
return 1; return 1;
...@@ -938,6 +938,11 @@ struct pblk_line *pblk_recov_l2p(struct pblk *pblk) ...@@ -938,6 +938,11 @@ struct pblk_line *pblk_recov_l2p(struct pblk *pblk)
goto next; goto next;
} }
if (pblk_recov_check_emeta(pblk, line->emeta->buf)) {
pblk_recov_l2p_from_oob(pblk, line);
goto next;
}
if (pblk_recov_l2p_from_emeta(pblk, line)) if (pblk_recov_l2p_from_emeta(pblk, line))
pblk_recov_l2p_from_oob(pblk, line); pblk_recov_l2p_from_oob(pblk, line);
......
...@@ -808,7 +808,7 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq); ...@@ -808,7 +808,7 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq);
void pblk_submit_rec(struct work_struct *work); void pblk_submit_rec(struct work_struct *work);
struct pblk_line *pblk_recov_l2p(struct pblk *pblk); struct pblk_line *pblk_recov_l2p(struct pblk *pblk);
int pblk_recov_pad(struct pblk *pblk); int pblk_recov_pad(struct pblk *pblk);
__le64 *pblk_recov_get_lba_list(struct pblk *pblk, struct line_emeta *emeta); int pblk_recov_check_emeta(struct pblk *pblk, struct line_emeta *emeta);
int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx, int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx,
struct pblk_rec_ctx *recovery, u64 *comp_bits, struct pblk_rec_ctx *recovery, u64 *comp_bits,
unsigned int comp); unsigned int comp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment