From: Igor Konopko <igor.j.konopko@intel.com>
To: mb@lightnvm.io, javier@javigon.com, hans.holmberg@cnexlabs.com
Cc: linux-block@vger.kernel.org, igor.j.konopko@intel.com
Subject: [PATCH v2 14/16] lightnvm: pblk: GC error handling
Date: Fri, 22 Mar 2019 15:48:41 +0100 [thread overview]
Message-ID: <20190322144843.9602-15-igor.j.konopko@intel.com> (raw)
In-Reply-To: <20190322144843.9602-1-igor.j.konopko@intel.com>
Currently when there is an IO error (or similar) on GC read path, pblk
still moves this line to free state, what leads to data mismatch issue.
This patch adds a handling for such an error - after that changes this
line will be returned to closed state so it can be still in use
for reading - at least we will be able to return error status to user
when user tries to read such a data.
Signed-off-by: Igor Konopko <igor.j.konopko@intel.com>
Reviewed-by: Javier González <javier@javigon.com>
Reviewed-by: Hans Holmberg <hans.holmberg@cnexlabs.com>
---
drivers/lightnvm/pblk-core.c | 8 ++++++++
drivers/lightnvm/pblk-gc.c | 5 ++---
drivers/lightnvm/pblk-read.c | 1 -
drivers/lightnvm/pblk.h | 2 ++
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 9d9a9e2..1b88e5e 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -1799,6 +1799,14 @@ static void __pblk_line_put(struct pblk *pblk, struct pblk_line *line)
spin_lock(&line->lock);
WARN_ON(line->state != PBLK_LINESTATE_GC);
+ if (line->w_err_gc->has_gc_err) {
+ spin_unlock(&line->lock);
+ pblk_err(pblk, "line %d had errors during GC\n", line->id);
+ pblk_put_line_back(pblk, line);
+ line->w_err_gc->has_gc_err = 0;
+ return;
+ }
+
line->state = PBLK_LINESTATE_FREE;
trace_pblk_line_state(pblk_disk_name(pblk), line->id,
line->state);
diff --git a/drivers/lightnvm/pblk-gc.c b/drivers/lightnvm/pblk-gc.c
index e23b192..63ee205 100644
--- a/drivers/lightnvm/pblk-gc.c
+++ b/drivers/lightnvm/pblk-gc.c
@@ -59,7 +59,7 @@ static void pblk_gc_writer_kick(struct pblk_gc *gc)
wake_up_process(gc->gc_writer_ts);
}
-static void pblk_put_line_back(struct pblk *pblk, struct pblk_line *line)
+void pblk_put_line_back(struct pblk *pblk, struct pblk_line *line)
{
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
struct list_head *move_list;
@@ -98,8 +98,7 @@ static void pblk_gc_line_ws(struct work_struct *work)
/* Read from GC victim block */
ret = pblk_submit_read_gc(pblk, gc_rq);
if (ret) {
- pblk_err(pblk, "failed GC read in line:%d (err:%d)\n",
- line->id, ret);
+ line->w_err_gc->has_gc_err = 1;
goto out;
}
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
index 264d1d7..5481dfa 100644
--- a/drivers/lightnvm/pblk-read.c
+++ b/drivers/lightnvm/pblk-read.c
@@ -494,7 +494,6 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
if (pblk_submit_io_sync(pblk, &rqd)) {
ret = -EIO;
- pblk_err(pblk, "GC read request failed\n");
goto err_free_bio;
}
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index 0999245..0bc4255 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -425,6 +425,7 @@ struct pblk_smeta {
struct pblk_w_err_gc {
int has_write_err;
+ int has_gc_err;
__le64 *lba_list;
};
@@ -916,6 +917,7 @@ void pblk_gc_free_full_lines(struct pblk *pblk);
void pblk_gc_sysfs_state_show(struct pblk *pblk, int *gc_enabled,
int *gc_active);
int pblk_gc_sysfs_force(struct pblk *pblk, int force);
+void pblk_put_line_back(struct pblk *pblk, struct pblk_line *line);
/*
* pblk rate limiter
--
2.9.5
next prev parent reply other threads:[~2019-03-22 14:52 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-22 14:48 [PATCH v2 00/16] lightnvm: next set of improvements for 5.2 Igor Konopko
2019-03-22 14:48 ` [PATCH v2 01/16] lightnvm: pblk: warn when there are opened chunks Igor Konopko
2019-03-25 11:32 ` Matias Bjørling
2019-03-22 14:48 ` [PATCH v2 02/16] lightnvm: pblk: IO path reorganization Igor Konopko
2019-03-25 5:55 ` Javier González
2019-03-22 14:48 ` [PATCH v2 03/16] lightnvm: pblk: simplify partial read path Igor Konopko
2019-03-22 14:48 ` [PATCH v2 04/16] lightnvm: pblk: OOB recovery for closed chunks fix Igor Konopko
2019-03-25 6:02 ` Javier González
2019-03-25 11:12 ` Igor Konopko
2019-03-22 14:48 ` [PATCH v2 05/16] lightnvm: pblk: propagate errors when reading meta Igor Konopko
2019-03-22 14:48 ` [PATCH v2 06/16] lightnvm: pblk: recover only written metadata Igor Konopko
2019-03-22 14:48 ` [PATCH v2 07/16] lightnvm: pblk: wait for inflight IOs in recovery Igor Konopko
2019-03-25 6:18 ` Javier González
2019-03-25 11:17 ` Igor Konopko
2019-03-22 14:48 ` [PATCH v2 08/16] lightnvm: pblk: remove internal IO timeout Igor Konopko
2019-03-22 14:48 ` [PATCH v2 09/16] lightnvm: pblk: fix spin_unlock order Igor Konopko
2019-03-25 11:09 ` Matias Bjørling
2019-03-22 14:48 ` [PATCH v2 10/16] lightnvm: pblk: kick writer on write recovery path Igor Konopko
2019-03-25 11:13 ` Matias Bjørling
2019-03-22 14:48 ` [PATCH v2 11/16] lightnvm: pblk: fix update line wp in OOB recovery Igor Konopko
2019-03-25 11:18 ` Matias Bjørling
2019-03-22 14:48 ` [PATCH v2 12/16] lightnvm: pblk: do not read OOB from emeta region Igor Konopko
2019-03-25 6:23 ` Javier González
2019-03-25 11:17 ` Igor Konopko
2019-03-22 14:48 ` [PATCH v2 13/16] lightnvm: pblk: store multiple copies of smeta Igor Konopko
2019-03-25 6:31 ` Javier González
2019-03-22 14:48 ` Igor Konopko [this message]
2019-03-25 11:29 ` [PATCH v2 14/16] lightnvm: pblk: GC error handling Matias Bjørling
2019-03-22 14:48 ` [PATCH v2 15/16] lightnvm: pblk: use nvm_rq_to_ppa_list() Igor Konopko
2019-03-22 14:48 ` [PATCH v2 16/16] lightnvm: track inflight target creations Igor Konopko
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=20190322144843.9602-15-igor.j.konopko@intel.com \
--to=igor.j.konopko@intel.com \
--cc=hans.holmberg@cnexlabs.com \
--cc=javier@javigon.com \
--cc=linux-block@vger.kernel.org \
--cc=mb@lightnvm.io \
/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).