mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
lightnvm: pblk: fix update line wp in OOB recovery
In case of OOB recovery, we can hit the scenario when all the data in line were written and some part of emeta was written too. In such a case pblk_update_line_wp() function will call pblk_alloc_page() function which will case to set left_msecs to value below zero (since this field does not track emeta region) and thus will lead to multiple kernel warnings. This patch fixes that issue. Signed-off-by: Igor Konopko <igor.j.konopko@intel.com> Reviewed-by: Javier González <javier@javigon.com> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
74a37fbb5c
commit
2b0ae81e2a
1 changed files with 15 additions and 1 deletions
|
@ -93,10 +93,24 @@ static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line)
|
||||||
static void pblk_update_line_wp(struct pblk *pblk, struct pblk_line *line,
|
static void pblk_update_line_wp(struct pblk *pblk, struct pblk_line *line,
|
||||||
u64 written_secs)
|
u64 written_secs)
|
||||||
{
|
{
|
||||||
|
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < written_secs; i += pblk->min_write_pgs)
|
for (i = 0; i < written_secs; i += pblk->min_write_pgs)
|
||||||
pblk_alloc_page(pblk, line, pblk->min_write_pgs);
|
__pblk_alloc_page(pblk, line, pblk->min_write_pgs);
|
||||||
|
|
||||||
|
spin_lock(&l_mg->free_lock);
|
||||||
|
if (written_secs > line->left_msecs) {
|
||||||
|
/*
|
||||||
|
* We have all data sectors written
|
||||||
|
* and some emeta sectors written too.
|
||||||
|
*/
|
||||||
|
line->left_msecs = 0;
|
||||||
|
} else {
|
||||||
|
/* We have only some data sectors written. */
|
||||||
|
line->left_msecs -= written_secs;
|
||||||
|
}
|
||||||
|
spin_unlock(&l_mg->free_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 pblk_sec_in_open_line(struct pblk *pblk, struct pblk_line *line)
|
static u64 pblk_sec_in_open_line(struct pblk *pblk, struct pblk_line *line)
|
||||||
|
|
Loading…
Reference in a new issue