aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Konopko <igor.j.konopko@intel.com>2019-05-04 14:37:54 -0400
committerJens Axboe <axboe@kernel.dk>2019-05-06 12:19:17 -0400
commitd38954ed1b76a2814057cd4af92c6966bceb3d3c (patch)
tree1d3ea312afe100f2feb4d3e91759a37bb335dfe7
parent6e46b8b24ffbc4ecb5b606094dbc8ed5d6281f59 (diff)
lightnvm: pblk: set proper read status in bio
Currently in case of read errors, bi_status is not set properly which leads to returning inproper data to layers above. This patch fix that by setting proper status in case of read errors. Also remove unnecessary warn_once(), which does not make sense in that place, since user bio is not used for interation with drive and thus bi_status will not be set here. 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> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--drivers/lightnvm/pblk-read.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
index b8eb6bdb983b..7b7a04a80d67 100644
--- a/drivers/lightnvm/pblk-read.c
+++ b/drivers/lightnvm/pblk-read.c
@@ -175,11 +175,10 @@ static void pblk_read_check_rand(struct pblk *pblk, struct nvm_rq *rqd,
175 WARN_ONCE(j != rqd->nr_ppas, "pblk: corrupted random request\n"); 175 WARN_ONCE(j != rqd->nr_ppas, "pblk: corrupted random request\n");
176} 176}
177 177
178static void pblk_end_user_read(struct bio *bio) 178static void pblk_end_user_read(struct bio *bio, int error)
179{ 179{
180#ifdef CONFIG_NVM_PBLK_DEBUG 180 if (error && error != NVM_RSP_WARN_HIGHECC)
181 WARN_ONCE(bio->bi_status, "pblk: corrupted read bio\n"); 181 bio_io_error(bio);
182#endif
183 bio_endio(bio); 182 bio_endio(bio);
184} 183}
185 184
@@ -219,7 +218,7 @@ static void pblk_end_io_read(struct nvm_rq *rqd)
219 struct pblk_g_ctx *r_ctx = nvm_rq_to_pdu(rqd); 218 struct pblk_g_ctx *r_ctx = nvm_rq_to_pdu(rqd);
220 struct bio *bio = (struct bio *)r_ctx->private; 219 struct bio *bio = (struct bio *)r_ctx->private;
221 220
222 pblk_end_user_read(bio); 221 pblk_end_user_read(bio, rqd->error);
223 __pblk_end_io_read(pblk, rqd, true); 222 __pblk_end_io_read(pblk, rqd, true);
224} 223}
225 224
@@ -298,7 +297,7 @@ static void pblk_end_partial_read(struct nvm_rq *rqd)
298 rqd->bio = NULL; 297 rqd->bio = NULL;
299 rqd->nr_ppas = nr_secs; 298 rqd->nr_ppas = nr_secs;
300 299
301 bio_endio(bio); 300 pblk_end_user_read(bio, rqd->error);
302 __pblk_end_io_read(pblk, rqd, false); 301 __pblk_end_io_read(pblk, rqd, false);
303} 302}
304 303