All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sagi Grimberg <sagig@dev.mellanox.co.il>
To: "Martin K. Petersen" <martin.petersen@oracle.com>,
	axboe@fb.com, nab@daterainc.com, linux-scsi@vger.kernel.org
Subject: Re: [PATCH 11/14] block: Don't merge requests if integrity flags differ
Date: Thu, 03 Jul 2014 13:06:11 +0300	[thread overview]
Message-ID: <53B52B13.2030603@dev.mellanox.co.il> (raw)
In-Reply-To: <1401334128-15499-12-git-send-email-martin.petersen@oracle.com>

On 5/29/2014 6:28 AM, Martin K. Petersen wrote:
> We'd occasionally merge requests with conflicting integrity flags.
> Introduce a merge helper which checks that the requests have compatible
> integrity payloads.
>
> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
> ---
>   block/blk-integrity.c  | 36 ++++++++++++++++++++++++++----------
>   block/blk-merge.c      |  6 +++---
>   include/linux/blkdev.h | 20 ++++++++++----------
>   3 files changed, 39 insertions(+), 23 deletions(-)
>
> diff --git a/block/blk-integrity.c b/block/blk-integrity.c
> index 8cf87655152b..da608e73bdb1 100644
> --- a/block/blk-integrity.c
> +++ b/block/blk-integrity.c
> @@ -186,37 +186,53 @@ int blk_integrity_compare(struct gendisk *gd1, struct gendisk *gd2)
>   }
>   EXPORT_SYMBOL(blk_integrity_compare);
>   
> -int blk_integrity_merge_rq(struct request_queue *q, struct request *req,
> -			   struct request *next)
> +bool blk_integrity_merge_rq(struct request_queue *q, struct request *req,
> +			    struct request *next)
>   {
> -	if (blk_integrity_rq(req) != blk_integrity_rq(next))
> -		return -1;
> +	if (blk_integrity_rq(req) == 0 && blk_integrity_rq(next) == 0)
> +		return true;
> +
> +	if (blk_integrity_rq(req) == 0 || blk_integrity_rq(next) == 0)
> +		return false;
> +
> +	if (bio_integrity(req->bio)->bip_flags !=
> +	    bio_integrity(next->bio)->bip_flags)
> +		return false;
>   
>   	if (req->nr_integrity_segments + next->nr_integrity_segments >
>   	    q->limits.max_integrity_segments)
> -		return -1;
> +		return false;
>   
> -	return 0;
> +	return true;
>   }
>   EXPORT_SYMBOL(blk_integrity_merge_rq);
>   
> -int blk_integrity_merge_bio(struct request_queue *q, struct request *req,
> -			    struct bio *bio)
> +bool blk_integrity_merge_bio(struct request_queue *q, struct request *req,
> +			     struct bio *bio)
>   {
>   	int nr_integrity_segs;
>   	struct bio *next = bio->bi_next;
>   
> +	if (blk_integrity_rq(req) == 0 && bio_integrity(bio) == NULL)
> +		return true;
> +
> +	if (blk_integrity_rq(req) == 0 || bio_integrity(bio) == NULL)
> +		return false;
> +
> +	if (bio_integrity(req->bio)->bip_flags != bio_integrity(bio)->bip_flags)
> +		return false;
> +
>   	bio->bi_next = NULL;
>   	nr_integrity_segs = blk_rq_count_integrity_sg(q, bio);
>   	bio->bi_next = next;
>   
>   	if (req->nr_integrity_segments + nr_integrity_segs >
>   	    q->limits.max_integrity_segments)
> -		return -1;
> +		return false;
>   
>   	req->nr_integrity_segments += nr_integrity_segs;
>   
> -	return 0;
> +	return true;
>   }
>   EXPORT_SYMBOL(blk_integrity_merge_bio);
>   
> diff --git a/block/blk-merge.c b/block/blk-merge.c
> index 6c583f9c5b65..21e38f407785 100644
> --- a/block/blk-merge.c
> +++ b/block/blk-merge.c
> @@ -294,7 +294,7 @@ static inline int ll_new_hw_segment(struct request_queue *q,
>   	if (req->nr_phys_segments + nr_phys_segs > queue_max_segments(q))
>   		goto no_merge;
>   
> -	if (bio_integrity(bio) && blk_integrity_merge_bio(q, req, bio))
> +	if (blk_integrity_merge_bio(q, req, bio) == false)
>   		goto no_merge;
>   
>   	/*
> @@ -391,7 +391,7 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
>   	if (total_phys_segments > queue_max_segments(q))
>   		return 0;
>   
> -	if (blk_integrity_rq(req) && blk_integrity_merge_rq(q, req, next))
> +	if (blk_integrity_merge_rq(q, req, next) == false)
>   		return 0;
>   
>   	/* Merge is OK... */
> @@ -569,7 +569,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
>   		return false;
>   
>   	/* only merge integrity protected bio into ditto rq */
> -	if (bio_integrity(bio) != blk_integrity_rq(rq))
> +	if (blk_integrity_merge_bio(rq->q, rq, bio) == false)
>   		return false;
>   
>   	/* must be using the same buffer */
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 9bf6f761f1ac..45cd70cda4e8 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -1467,10 +1467,10 @@ extern int blk_integrity_compare(struct gendisk *, struct gendisk *);
>   extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *,
>   				   struct scatterlist *);
>   extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
> -extern int blk_integrity_merge_rq(struct request_queue *, struct request *,
> -				  struct request *);
> -extern int blk_integrity_merge_bio(struct request_queue *, struct request *,
> -				   struct bio *);
> +extern bool blk_integrity_merge_rq(struct request_queue *, struct request *,
> +				   struct request *);
> +extern bool blk_integrity_merge_bio(struct request_queue *, struct request *,
> +				    struct bio *);
>   
>   static inline
>   struct blk_integrity *bdev_get_integrity(struct block_device *bdev)
> @@ -1550,15 +1550,15 @@ static inline unsigned short queue_max_integrity_segments(struct request_queue *
>   {
>   	return 0;
>   }
> -static inline int blk_integrity_merge_rq(struct request_queue *rq,
> -					 struct request *r1,
> -					 struct request *r2)
> +static inline bool blk_integrity_merge_rq(struct request_queue *rq,
> +					  struct request *r1,
> +					  struct request *r2)
>   {
>   	return 0;
>   }
> -static inline int blk_integrity_merge_bio(struct request_queue *rq,
> -					  struct request *r,
> -					  struct bio *b)
> +static inline bool blk_integrity_merge_bio(struct request_queue *rq,
> +					   struct request *r,
> +					   struct bio *b)
>   {
>   	return 0;
>   }

Reviewed-by: Sagi Grimberg <sagig@mellanox.com>

  parent reply	other threads:[~2014-07-03 10:06 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-29  3:28 Data integrity update Martin K. Petersen
2014-05-29  3:28 ` [PATCH 01/14] block: Get rid of bdev_integrity_enabled() Martin K. Petersen
2014-06-11 16:31   ` Christoph Hellwig
2014-07-03  9:18     ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 02/14] block: Replace bi_integrity with bi_special Martin K. Petersen
2014-06-11 16:32   ` Christoph Hellwig
2014-06-12  0:18     ` Martin K. Petersen
2014-07-03  9:19       ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 03/14] block: Deprecate integrity tagging functions Martin K. Petersen
2014-06-11 16:33   ` Christoph Hellwig
2014-06-12  0:18     ` Martin K. Petersen
2014-05-29  3:28 ` [PATCH 04/14] block: Remove bip_buf Martin K. Petersen
2014-06-11 16:35   ` Christoph Hellwig
2014-07-03  9:21     ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 05/14] block: Deprecate the use of the term sector in the context of block integrity Martin K. Petersen
2014-06-11 16:45   ` Christoph Hellwig
2014-06-12  0:26     ` Martin K. Petersen
2014-07-03  9:35   ` Sagi Grimberg
2014-07-03 10:19     ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 06/14] block: Clean up the code used to generate and verify integrity metadata Martin K. Petersen
2014-07-03  9:40   ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 07/14] block: Add prefix to block integrity profile flags Martin K. Petersen
2014-06-11 16:46   ` Christoph Hellwig
2014-07-03  9:42   ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 08/14] block: Add a disk flag to block integrity profile Martin K. Petersen
2014-06-11 16:48   ` Christoph Hellwig
2014-06-12  1:30     ` Martin K. Petersen
2014-06-25 10:24       ` Christoph Hellwig
2014-06-25 11:49         ` Martin K. Petersen
2014-07-03  9:58           ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 09/14] block: Relocate integrity flags Martin K. Petersen
2014-06-11 16:51   ` Christoph Hellwig
2014-06-12  1:51     ` Martin K. Petersen
2014-07-03 10:03   ` Sagi Grimberg
2014-05-29  3:28 ` [PATCH 10/14] block: Integrity checksum flag Martin K. Petersen
2014-06-11 16:52   ` Christoph Hellwig
2014-06-12  2:03     ` Martin K. Petersen
2014-05-29  3:28 ` [PATCH 11/14] block: Don't merge requests if integrity flags differ Martin K. Petersen
2014-06-11 16:53   ` Christoph Hellwig
2014-07-03 10:06   ` Sagi Grimberg [this message]
2014-05-29  3:28 ` [PATCH 12/14] block: Add specific data integrity errors Martin K. Petersen
2014-06-11 16:54   ` Christoph Hellwig
     [not found]     ` <20140611165455.GG9511-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2014-06-12  2:16       ` Martin K. Petersen
2014-06-12  2:16         ` Martin K. Petersen
2014-05-29  3:28 ` [PATCH 13/14] lib: Add T10 Protection Information functions Martin K. Petersen
2014-06-11 16:56   ` Christoph Hellwig
2014-06-12  2:23     ` Martin K. Petersen
2014-05-29  3:28 ` [PATCH 14/14] sd: Honor block layer integrity handling flags Martin K. Petersen

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=53B52B13.2030603@dev.mellanox.co.il \
    --to=sagig@dev.mellanox.co.il \
    --cc=axboe@fb.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=nab@daterainc.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 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.