All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matias Bjørling" <mb@lightnvm.io>
To: "Javier González" <javier@javigon.com>
Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Javier González" <javier@cnexlabs.com>
Subject: Re: [PATCH 03/11] lightnvm: pblk: check read lba on gc path
Date: Tue, 17 Apr 2018 14:03:52 +0200	[thread overview]
Message-ID: <f41f6858-77d1-5856-0719-a765251f5679@lightnvm.io> (raw)
In-Reply-To: <1523874332-6272-4-git-send-email-javier@cnexlabs.com>

On 4/16/18 12:25 PM, Javier González wrote:
> Check that the lba stored in the LBA metadata is correct in the GC path
> too. This requires a new helper function to check random reads in the
> vector read.
> 
> Signed-off-by: Javier González <javier@cnexlabs.com>
> ---
>   drivers/lightnvm/pblk-read.c | 39 +++++++++++++++++++++++++++++++++------
>   1 file changed, 33 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
> index 9eee10f69df0..0d45d4ffc370 100644
> --- a/drivers/lightnvm/pblk-read.c
> +++ b/drivers/lightnvm/pblk-read.c
> @@ -113,15 +113,14 @@ static int pblk_submit_read_io(struct pblk *pblk, struct nvm_rq *rqd)
>   	return NVM_IO_OK;
>   }
>   
> -static void pblk_read_check(struct pblk *pblk, struct nvm_rq *rqd,
> -			   sector_t blba)
> +static void pblk_read_check_seq(struct pblk *pblk, void *meta_list,
> +				sector_t blba, int nr_lbas)
>   {
> -	struct pblk_sec_meta *meta_list = rqd->meta_list;
> -	int nr_lbas = rqd->nr_ppas;
> +	struct pblk_sec_meta *meta_lba_list = meta_list;
>   	int i;
>   
>   	for (i = 0; i < nr_lbas; i++) {
> -		u64 lba = le64_to_cpu(meta_list[i].lba);
> +		u64 lba = le64_to_cpu(meta_lba_list[i].lba);
>   
>   		if (lba == ADDR_EMPTY)
>   			continue;
> @@ -130,6 +129,32 @@ static void pblk_read_check(struct pblk *pblk, struct nvm_rq *rqd,
>   	}
>   }
>   
> +/*
> + * There can be wholes in the lba list.
> + */

holes

> +static void pblk_read_check_rand(struct pblk *pblk, void *meta_list,
> +				u64 *lba_list, int nr_lbas)
> +{
> +	struct pblk_sec_meta *meta_lba_list = meta_list;
> +	int i, j;
> +
> +	for (i = 0, j = 0; i < nr_lbas; i++) {
> +		u64 lba = lba_list[i];
> +		u64 meta_lba;
> +
> +		if (lba == ADDR_EMPTY)
> +			continue;
> +
> +		meta_lba = le64_to_cpu(meta_lba_list[j++].lba);

You can move the j++ into the for loop. Although, why not use just the i 
iterator?

> +
> +		if (lba != meta_lba) {
> +			pr_err("pblk: corrupted read LBA (%llu/%llu)\n",
> +								lba, meta_lba);
> +			WARN_ON(1);

I don't understand this, if a corrupted LBA is found here, how is it 
communicated back to pblk and the LBA can be recovered from elsewhere. 
If the data is wrong, this should have been communicated by the drive on 
the completion path. The drive is defect if this happens.


> +		}
> +	}
> +}
> +
>   static void pblk_read_put_rqd_kref(struct pblk *pblk, struct nvm_rq *rqd)
>   {
>   	struct ppa_addr *ppa_list;
> @@ -172,7 +197,7 @@ static void __pblk_end_io_read(struct pblk *pblk, struct nvm_rq *rqd,
>   		WARN_ONCE(bio->bi_status, "pblk: corrupted read error\n");
>   #endif
>   
> -	pblk_read_check(pblk, rqd, r_ctx->lba);
> +	pblk_read_check_seq(pblk, rqd->meta_list, r_ctx->lba, rqd->nr_ppas);
>   
>   	bio_put(bio);
>   	if (r_ctx->private)
> @@ -585,6 +610,8 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
>   		goto err_free_bio;
>   	}
>   
> +	pblk_read_check_rand(pblk, rqd.meta_list, gc_rq->lba_list, rqd.nr_ppas);
> +
>   	atomic_dec(&pblk->inflight_io);
>   
>   	if (rqd.error) {
> 

  reply	other threads:[~2018-04-17 12:04 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-16 10:25 [PATCH 00/11] lightnvm: pblk: small fixes Javier González
2018-04-16 10:25 ` [PATCH 01/11] lightnvm: pblk: fail gracefully on line alloc. failure Javier González
2018-04-16 10:25 ` [PATCH 02/11] lightnvm: pblk: recheck for bad lines at runtime Javier González
2018-04-16 10:25 ` [PATCH 03/11] lightnvm: pblk: check read lba on gc path Javier González
2018-04-17 12:03   ` Matias Bjørling [this message]
2018-04-18 11:53     ` Javier González
2018-04-16 10:25 ` [PATCH 04/11] lightnvn: pblk: improve error msg on corrupted LBAs Javier González
2018-04-16 10:25 ` [PATCH 05/11] lightnvm: pblk: warn in case of corrupted write buffer Javier González
2018-04-16 10:25 ` [PATCH 06/11] lightnvm: pblk: return NVM_ error on failed submission Javier González
2018-04-16 10:25 ` [PATCH 07/11] lightnvm: pblk: remove unnecessary indirection Javier González
2018-04-17 12:11   ` Matias Bjørling
2018-04-18 12:08     ` Javier Gonzalez
2018-04-16 10:25 ` [PATCH 08/11] lightnvm: pblk: remove unnecessary argument Javier González
2018-04-17 12:12   ` Matias Bjørling
2018-04-18 11:43     ` Javier González
2018-04-16 10:25 ` [PATCH 09/11] lightnvm: pblk: check for chunk size before allocating it Javier González
2018-04-16 10:25 ` [PATCH 10/11] lightnvn: pass flag on graceful teardown to targets Javier González
2018-04-16 10:25 ` [PATCH 11/11] lightnvm: pblk: remove dead function Javier González
2018-04-30  9:09 [V2 PATCH 00/11] lightnvm: pblk: small fixes Javier González
2018-04-30  9:10 ` [PATCH 03/11] lightnvm: pblk: check read lba on gc path Javier González

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=f41f6858-77d1-5856-0719-a765251f5679@lightnvm.io \
    --to=mb@lightnvm.io \
    --cc=javier@cnexlabs.com \
    --cc=javier@javigon.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.