linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Hans Holmberg <hans.ml.holmberg@owltronix.com>
To: Matias Bjorling <mb@lightnvm.io>
Cc: Javier Gonzales <javier@cnexlabs.com>,
	Sebastien Boisvert <sboisvert@gydle.com>,
	linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
	Hans Holmberg <hans.holmberg@cnexlabs.com>
Subject: [PATCH v3 2/7] lightnvm: pblk: account for write error sectors in emeta
Date: Tue,  6 Nov 2018 14:33:25 +0100	[thread overview]
Message-ID: <20181106133330.26570-3-hans.ml.holmberg@owltronix.com> (raw)
In-Reply-To: <20181106133330.26570-1-hans.ml.holmberg@owltronix.com>

From: Hans Holmberg <hans.holmberg@cnexlabs.com>

Lines inflicted with write errors lines might be recovered
if they have not been recycled after write error garbage collection.

Ensure that the emeta accounting of valid lbas is correct
for such lines to avoid recovery inconsistencies.

Signed-off-by: Hans Holmberg <hans.holmberg@cnexlabs.com>
---
 drivers/lightnvm/pblk-write.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c
index 3ddd16f47106..750f04b8a227 100644
--- a/drivers/lightnvm/pblk-write.c
+++ b/drivers/lightnvm/pblk-write.c
@@ -105,14 +105,20 @@ static void pblk_complete_write(struct pblk *pblk, struct nvm_rq *rqd,
 }
 
 /* Map remaining sectors in chunk, starting from ppa */
-static void pblk_map_remaining(struct pblk *pblk, struct ppa_addr *ppa)
+static void pblk_map_remaining(struct pblk *pblk, struct ppa_addr *ppa,
+		int rqd_ppas)
 {
 	struct pblk_line *line;
 	struct ppa_addr map_ppa = *ppa;
+	__le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
+	__le64 *lba_list;
 	u64 paddr;
 	int done = 0;
+	int n = 0;
 
 	line = pblk_ppa_to_line(pblk, *ppa);
+	lba_list = emeta_to_lbas(pblk, line->emeta->buf);
+
 	spin_lock(&line->lock);
 
 	while (!done)  {
@@ -121,10 +127,17 @@ static void pblk_map_remaining(struct pblk *pblk, struct ppa_addr *ppa)
 		if (!test_and_set_bit(paddr, line->map_bitmap))
 			line->left_msecs--;
 
+		if (n < rqd_ppas && lba_list[paddr] != addr_empty)
+			line->nr_valid_lbas--;
+
+		lba_list[paddr] = addr_empty;
+
 		if (!test_and_set_bit(paddr, line->invalid_bitmap))
 			le32_add_cpu(line->vsc, -1);
 
 		done = nvm_next_ppa_in_chk(pblk->dev, &map_ppa);
+
+		n++;
 	}
 
 	line->w_err_gc->has_write_err = 1;
@@ -202,7 +215,7 @@ static void pblk_submit_rec(struct work_struct *work)
 
 	pblk_log_write_err(pblk, rqd);
 
-	pblk_map_remaining(pblk, ppa_list);
+	pblk_map_remaining(pblk, ppa_list, rqd->nr_ppas);
 	pblk_queue_resubmit(pblk, c_ctx);
 
 	pblk_up_rq(pblk, c_ctx->lun_bitmap);
-- 
2.17.1


  parent reply	other threads:[~2018-11-06 13:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-06 13:33 [PATCH v3 0/7] PBLK Bugfixes and cleanups Hans Holmberg
2018-11-06 13:33 ` [PATCH v3 1/7] lightnvm: pblk: fix resubmission of overwritten write err lbas Hans Holmberg
2018-11-06 13:33 ` Hans Holmberg [this message]
2018-11-06 13:33 ` [PATCH v3 3/7] lightnvm: pblk: stop writes gracefully when running out of lines Hans Holmberg
2018-11-06 13:33 ` [PATCH v3 4/7] lightnvm: pblk: set conservative threshold for user writes Hans Holmberg
2018-11-06 13:33 ` [PATCH v3 5/7] lightnvm: pblk: remove unused macro Hans Holmberg
2018-11-06 13:33 ` [PATCH v3 6/7] lightnvm: pblk: fix pblk_lines_init error handling path Hans Holmberg
2018-11-06 13:33 ` [PATCH v3 7/7] lightnvm: pblk: remove dead code in pblk_recov_l2p Hans Holmberg
2018-11-07  8:47 ` [PATCH v3 0/7] PBLK Bugfixes and cleanups Matias Bjørling
2018-11-09  9:08 ` Matias Bjørling

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181106133330.26570-3-hans.ml.holmberg@owltronix.com \
    --to=hans.ml.holmberg@owltronix.com \
    --cc=hans.holmberg@cnexlabs.com \
    --cc=javier@cnexlabs.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mb@lightnvm.io \
    --cc=sboisvert@gydle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).