]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
lightnvm: pblk: don't recover unwritten lines
authorHans Holmberg <hans.holmberg@cnexlabs.com>
Thu, 29 Mar 2018 22:05:22 +0000 (00:05 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 29 Mar 2018 23:29:09 +0000 (17:29 -0600)
If the line has not been written to, we should not
try to recover any data from it, so check the state of the
chunks in the line before attempting to read smeta.

Signed-off-by: Hans Holmberg <hans.holmberg@cnexlabs.com>
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/lightnvm/pblk-recovery.c

index 26356429dc7204e0819520aa068becc9763e91d7..3e079c2afa6e7e8919d316aabb66a1a496487789 100644 (file)
@@ -864,6 +864,21 @@ static void pblk_recov_wa_counters(struct pblk *pblk,
        }
 }
 
+static int pblk_line_was_written(struct pblk_line *line,
+                           struct pblk_line_meta *lm)
+{
+
+       int i;
+       int state_mask = NVM_CHK_ST_OFFLINE | NVM_CHK_ST_FREE;
+
+       for (i = 0; i < lm->blk_per_line; i++) {
+               if (!(line->chks[i].state & state_mask))
+                       return 1;
+       }
+
+       return 0;
+}
+
 struct pblk_line *pblk_recov_l2p(struct pblk *pblk)
 {
        struct pblk_line_meta *lm = &pblk->lm;
@@ -900,6 +915,9 @@ struct pblk_line *pblk_recov_l2p(struct pblk *pblk)
                line->lun_bitmap = ((void *)(smeta_buf)) +
                                                sizeof(struct line_smeta);
 
+               if (!pblk_line_was_written(line, lm))
+                       continue;
+
                /* Lines that cannot be read are assumed as not written here */
                if (pblk_line_read_smeta(pblk, line))
                        continue;