The write pointer of the bad block could be 0 or undefined, ignore
the checking of the bad block wp for pblk_line_wp_is_unbalanced to
avoid fake warning.

Signed-off-by: Zhoujie Wu <[email protected]>
---
v3: return in case bit >= lm->blk_per_line.
v2: changed according to Javier's comments.

 drivers/lightnvm/pblk-recovery.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c
index 6761d2a..02d466e 100644
--- a/drivers/lightnvm/pblk-recovery.c
+++ b/drivers/lightnvm/pblk-recovery.c
@@ -312,21 +312,27 @@ static int pblk_line_wp_is_unbalanced(struct pblk *pblk,
        struct nvm_chk_meta *chunk;
        struct ppa_addr ppa;
        u64 line_wp;
-       int pos, i;
+       int pos, i, bit;
 
-       rlun = &pblk->luns[0];
+       bit = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line);
+       if (bit >= lm->blk_per_line)
+               return 0;
+       rlun = &pblk->luns[bit];
        ppa = rlun->bppa;
        pos = pblk_ppa_to_pos(geo, ppa);
        chunk = &line->chks[pos];
 
        line_wp = chunk->wp;
 
-       for (i = 1; i < lm->blk_per_line; i++) {
+       for (i = bit + 1; i < lm->blk_per_line; i++) {
                rlun = &pblk->luns[i];
                ppa = rlun->bppa;
                pos = pblk_ppa_to_pos(geo, ppa);
                chunk = &line->chks[pos];
 
+               if (chunk->state & NVM_CHK_ST_OFFLINE)
+                       continue;
+
                if (chunk->wp > line_wp)
                        return 1;
                else if (chunk->wp < line_wp)
-- 
1.9.1

Reply via email to