Linux-Block Archive on lore.kernel.org
 help / color / Atom feed
* Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits()
@ 2020-07-29 22:47 Ritika Srivastava
  2020-07-29 22:47 ` [PATCH 1/2] block: Return blk_status_t instead of errno codes Ritika Srivastava
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Ritika Srivastava @ 2020-07-29 22:47 UTC (permalink / raw)
  To: linux-block; +Cc: axboe, ritika.srivastava

Hi,
These patches address the comments from previous v1 version
block: return BLK_STS_NOTSUPP if operation is not supported

Updates since v1:
- Document scenario and SCSI error encountered in a comment in blk_cloned_rq_check_limits().
- Add a patch to switch returning errno codes to blk_status_t in blk_cloned_rq_check_limits().

Please review the following patches.
[PATCH 1/2] block: Return blk_status_t instead of errno codes
[PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported

Thanks,
Ritika

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/2] block: Return blk_status_t instead of errno codes
  2020-07-29 22:47 Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
@ 2020-07-29 22:47 ` Ritika Srivastava
  2020-08-14  6:26   ` Christoph Hellwig
  2020-07-29 22:47 ` [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported Ritika Srivastava
  2020-08-05 17:54 ` Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
  2 siblings, 1 reply; 7+ messages in thread
From: Ritika Srivastava @ 2020-07-29 22:47 UTC (permalink / raw)
  To: linux-block; +Cc: axboe, ritika.srivastava

Replace returning legacy errno codes with blk_status_t in
blk_cloned_rq_check_limits().

Signed-off-by: Ritika Srivastava <ritika.srivastava@oracle.com>
---
 block/blk-core.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index 9bfaee0..d241ab8 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1220,14 +1220,14 @@ blk_qc_t submit_bio(struct bio *bio)
  *    limits when retrying requests on other queues. Those requests need
  *    to be checked against the new queue limits again during dispatch.
  */
-static int blk_cloned_rq_check_limits(struct request_queue *q,
+static blk_status_t blk_cloned_rq_check_limits(struct request_queue *q,
 				      struct request *rq)
 {
 	if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, req_op(rq))) {
 		printk(KERN_ERR "%s: over max size limit. (%u > %u)\n",
 			__func__, blk_rq_sectors(rq),
 			blk_queue_get_max_sectors(q, req_op(rq)));
-		return -EIO;
+		return BLK_STS_IOERR;
 	}
 
 	/*
@@ -1240,10 +1240,10 @@ static int blk_cloned_rq_check_limits(struct request_queue *q,
 	if (rq->nr_phys_segments > queue_max_segments(q)) {
 		printk(KERN_ERR "%s: over max segments limit. (%hu > %hu)\n",
 			__func__, rq->nr_phys_segments, queue_max_segments(q));
-		return -EIO;
+		return BLK_STS_IOERR;
 	}
 
-	return 0;
+	return BLK_STS_OK;
 }
 
 /**
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported
  2020-07-29 22:47 Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
  2020-07-29 22:47 ` [PATCH 1/2] block: Return blk_status_t instead of errno codes Ritika Srivastava
@ 2020-07-29 22:47 ` Ritika Srivastava
  2020-08-14  6:37   ` Christoph Hellwig
  2020-08-05 17:54 ` Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
  2 siblings, 1 reply; 7+ messages in thread
From: Ritika Srivastava @ 2020-07-29 22:47 UTC (permalink / raw)
  To: linux-block; +Cc: axboe, ritika.srivastava

If WRITE_ZERO/WRITE_SAME operation is not supported by the storage,
blk_cloned_rq_check_limits() will return IO error which will cause
device-mapper to fail the paths.

Instead, if the queue limit is set to 0, return BLK_STS_NOTSUPP.
BLK_STS_NOTSUPP will be ignored by device-mapper and will not fail the
paths.

Suggested-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Ritika Srivastava <ritika.srivastava@oracle.com>
---
 block/blk-core.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index d241ab8..a6ebfeb 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1223,10 +1223,24 @@ blk_qc_t submit_bio(struct bio *bio)
 static blk_status_t blk_cloned_rq_check_limits(struct request_queue *q,
 				      struct request *rq)
 {
-	if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, req_op(rq))) {
+	unsigned int queue_max_sector = blk_queue_get_max_sectors(q, req_op(rq));
+
+	if (blk_rq_sectors(rq) > queue_max_sector) {
 		printk(KERN_ERR "%s: over max size limit. (%u > %u)\n",
-			__func__, blk_rq_sectors(rq),
-			blk_queue_get_max_sectors(q, req_op(rq)));
+			__func__, blk_rq_sectors(rq), queue_max_sector);
+
+		/* If storage does not support the operation,
+		 * the following SCSI error will be returned.
+		 * Illegal Request
+		 * Invalid command operation code
+		 *
+		 * In turn device will set the corresponding queue limit to 0.
+		 *
+		 * If limit is 0, do not return IO error,
+		 * instead return operation not supported.
+		 */
+		if (queue_max_sector == 0)
+			return BLK_STS_NOTSUPP;
 		return BLK_STS_IOERR;
 	}
 
@@ -1253,8 +1267,10 @@ static blk_status_t blk_cloned_rq_check_limits(struct request_queue *q,
  */
 blk_status_t blk_insert_cloned_request(struct request_queue *q, struct request *rq)
 {
-	if (blk_cloned_rq_check_limits(q, rq))
-		return BLK_STS_IOERR;
+	blk_status_t cloned_limit_check = blk_cloned_rq_check_limits(q, rq);
+
+	if (cloned_limit_check != BLK_STS_OK)
+		return cloned_limit_check;
 
 	if (rq->rq_disk &&
 	    should_fail_request(&rq->rq_disk->part0, blk_rq_bytes(rq)))
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits()
  2020-07-29 22:47 Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
  2020-07-29 22:47 ` [PATCH 1/2] block: Return blk_status_t instead of errno codes Ritika Srivastava
  2020-07-29 22:47 ` [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported Ritika Srivastava
@ 2020-08-05 17:54 ` Ritika Srivastava
  2020-08-13 19:13   ` Ritika Srivastava
  2 siblings, 1 reply; 7+ messages in thread
From: Ritika Srivastava @ 2020-08-05 17:54 UTC (permalink / raw)
  To: linux-block; +Cc: axboe, Christoph Hellwig

Hi,

Gentle ping
Please help review these.

Thanks,
Ritika

> On Jul 29, 2020, at 3:47 PM, Ritika Srivastava <ritika.srivastava@oracle.com> wrote:
> 
> Hi,
> These patches address the comments from previous v1 version
> block: return BLK_STS_NOTSUPP if operation is not supported
> 
> Updates since v1:
> - Document scenario and SCSI error encountered in a comment in blk_cloned_rq_check_limits().
> - Add a patch to switch returning errno codes to blk_status_t in blk_cloned_rq_check_limits().
> 
> Please review the following patches.
> [PATCH 1/2] block: Return blk_status_t instead of errno codes
> [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported
> 
> Thanks,
> Ritika


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits()
  2020-08-05 17:54 ` Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
@ 2020-08-13 19:13   ` Ritika Srivastava
  0 siblings, 0 replies; 7+ messages in thread
From: Ritika Srivastava @ 2020-08-13 19:13 UTC (permalink / raw)
  To: Christoph Hellwig, axboe, linux-block

Hi,

Ping..
Please help review these patches.

Thanks,
Ritika

> On Aug 5, 2020, at 10:54 AM, Ritika Srivastava <ritika.srivastava@oracle.com> wrote:
> 
> Hi,
> 
> Gentle ping
> Please help review these.
> 
> Thanks,
> Ritika
> 
>> On Jul 29, 2020, at 3:47 PM, Ritika Srivastava <ritika.srivastava@oracle.com> wrote:
>> 
>> Hi,
>> These patches address the comments from previous v1 version
>> block: return BLK_STS_NOTSUPP if operation is not supported
>> 
>> Updates since v1:
>> - Document scenario and SCSI error encountered in a comment in blk_cloned_rq_check_limits().
>> - Add a patch to switch returning errno codes to blk_status_t in blk_cloned_rq_check_limits().
>> 
>> Please review the following patches.
>> [PATCH 1/2] block: Return blk_status_t instead of errno codes
>> [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported
>> 
>> Thanks,
>> Ritika
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] block: Return blk_status_t instead of errno codes
  2020-07-29 22:47 ` [PATCH 1/2] block: Return blk_status_t instead of errno codes Ritika Srivastava
@ 2020-08-14  6:26   ` Christoph Hellwig
  0 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2020-08-14  6:26 UTC (permalink / raw)
  To: Ritika Srivastava; +Cc: linux-block, axboe

On Wed, Jul 29, 2020 at 03:47:57PM -0700, Ritika Srivastava wrote:
> Replace returning legacy errno codes with blk_status_t in
> blk_cloned_rq_check_limits().
> 
> Signed-off-by: Ritika Srivastava <ritika.srivastava@oracle.com>

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported
  2020-07-29 22:47 ` [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported Ritika Srivastava
@ 2020-08-14  6:37   ` Christoph Hellwig
  0 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2020-08-14  6:37 UTC (permalink / raw)
  To: Ritika Srivastava; +Cc: linux-block, axboe

The concept looks fine, but some of the formatting especially in the
comments is strange.  Also we should not print the message for this
case, but just the real error.  Updated version with my suggestions
below.

Also don't you need a third patch that makes dm-multipath stop sending
Write Same/Zeroes command when this happens?

---
From c056b0523173f17cd3d8ca77a8cfca4e45fe8cb7 Mon Sep 17 00:00:00 2001
From: Ritika Srivastava <ritika.srivastava@oracle.com>
Date: Wed, 29 Jul 2020 15:47:58 -0700
Subject: block: better deal with the delayed not supported case in
 blk_cloned_rq_check_limits

If WRITE_ZERO/WRITE_SAME operation is not supported by the storage,
blk_cloned_rq_check_limits() will return IO error which will cause
device-mapper to fail the paths.

Instead, if the queue limit is set to 0, return BLK_STS_NOTSUPP.
BLK_STS_NOTSUPP will be ignored by device-mapper and will not fail the
paths.

Suggested-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Ritika Srivastava <ritika.srivastava@oracle.com>
---
 block/blk-core.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index e04ee2c8da2e95..81b830c24b5b4f 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1296,10 +1296,21 @@ EXPORT_SYMBOL(submit_bio);
 static blk_status_t blk_cloned_rq_check_limits(struct request_queue *q,
 				      struct request *rq)
 {
-	if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, req_op(rq))) {
+	unsigned int max_sectors = blk_queue_get_max_sectors(q, req_op(rq));
+
+	if (blk_rq_sectors(rq) > max_sectors) {
+		/*
+		 * At least SCSI device do not have a good way to return if
+		 * Write Same is actually supported.  So we first try to issue
+		 * one and if it fails clear the max sectors value on failure.
+		 * If this occurs onthe lower device we need to propagate the
+		 * right error code up.
+		 */
+		if (max_sectors == 0)
+			return BLK_STS_NOTSUPP;
+
 		printk(KERN_ERR "%s: over max size limit. (%u > %u)\n",
-			__func__, blk_rq_sectors(rq),
-			blk_queue_get_max_sectors(q, req_op(rq)));
+			__func__, blk_rq_sectors(rq), max_sectors);
 		return BLK_STS_IOERR;
 	}
 
@@ -1326,8 +1337,11 @@ static blk_status_t blk_cloned_rq_check_limits(struct request_queue *q,
  */
 blk_status_t blk_insert_cloned_request(struct request_queue *q, struct request *rq)
 {
-	if (blk_cloned_rq_check_limits(q, rq))
-		return BLK_STS_IOERR;
+	blk_status_t ret;
+
+	ret = blk_cloned_rq_check_limits(q, rq);
+	if (ret != BLK_STS_OK)
+		return ret;
 
 	if (rq->rq_disk &&
 	    should_fail_request(&rq->rq_disk->part0, blk_rq_bytes(rq)))
-- 
2.28.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, back to index

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-29 22:47 Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
2020-07-29 22:47 ` [PATCH 1/2] block: Return blk_status_t instead of errno codes Ritika Srivastava
2020-08-14  6:26   ` Christoph Hellwig
2020-07-29 22:47 ` [PATCH v2 2/2] block: return BLK_STS_NOTSUPP if operation is not supported Ritika Srivastava
2020-08-14  6:37   ` Christoph Hellwig
2020-08-05 17:54 ` Return BLK_STS_NOTSUPP and blk_status_t from blk_cloned_rq_check_limits() Ritika Srivastava
2020-08-13 19:13   ` Ritika Srivastava

Linux-Block Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-block/0 linux-block/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-block linux-block/ https://lore.kernel.org/linux-block \
		linux-block@vger.kernel.org
	public-inbox-index linux-block

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-block


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git