All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@kernel.dk>
Cc: "Josef Bacik" <jbacik@fb.com>,
	"James Smart" <james.smart@broadcom.com>,
	"Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>,
	"Roger Pau Monné" <roger.pau@citrix.com>,
	linux-scsi@vger.kernel.org, linux-nvme@lists.infradead.org,
	linux-block@vger.kernel.org, dm-devel@redhat.com
Subject: [PATCH 08/25] scsi: fix fast-fail for non-passthrough requests
Date: Thu,  6 Apr 2017 17:39:27 +0200	[thread overview]
Message-ID: <20170406153944.10058-9-hch@lst.de> (raw)
In-Reply-To: <20170406153944.10058-1-hch@lst.de>

Currently error is always 0 for non-passthrough requests when reaching the
scsi_noretry_cmd check in scsi_io_completion, which effectively disables
all fastfail logic.  Fix this by having a single call to
__scsi_error_from_host_byte at the beginning of the function and always
having a valid error value.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/scsi/scsi_lib.c | 28 +++++++---------------------
 1 file changed, 7 insertions(+), 21 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 11972d1075f1..89b4d9e69866 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -779,21 +779,17 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 		sense_valid = scsi_command_normalize_sense(cmd, &sshdr);
 		if (sense_valid)
 			sense_deferred = scsi_sense_is_deferred(&sshdr);
+
+		if (!sense_deferred)
+			error = __scsi_error_from_host_byte(cmd, result);
 	}
 
 	if (blk_rq_is_passthrough(req)) {
-		if (result) {
-			if (sense_valid) {
-				/*
-				 * SG_IO wants current and deferred errors
-				 */
-				scsi_req(req)->sense_len =
-					min(8 + cmd->sense_buffer[7],
-					    SCSI_SENSE_BUFFERSIZE);
-			}
-			if (!sense_deferred)
-				error = __scsi_error_from_host_byte(cmd, result);
+		if (result && sense_valid) {
+			scsi_req(req)->sense_len = min(8 + cmd->sense_buffer[7],
+						       SCSI_SENSE_BUFFERSIZE);
 		}
+
 		/*
 		 * __scsi_error_from_host_byte may have reset the host_byte
 		 */
@@ -812,13 +808,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 				BUG();
 			return;
 		}
-	} else if (blk_rq_bytes(req) == 0 && result && !sense_deferred) {
-		/*
-		 * Flush commands do not transfers any data, and thus cannot use
-		 * good_bytes != blk_rq_bytes(req) as the signal for an error.
-		 * This sets the error explicitly for the problem case.
-		 */
-		error = __scsi_error_from_host_byte(cmd, result);
 	}
 
 	/* no bidi support for !blk_rq_is_passthrough yet */
@@ -848,7 +837,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 		else if (!(req->rq_flags & RQF_QUIET))
 			scsi_print_sense(cmd);
 		result = 0;
-		/* for passthrough error may be set */
 		error = 0;
 	}
 
@@ -877,8 +865,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 	if (result == 0)
 		goto requeue;
 
-	error = __scsi_error_from_host_byte(cmd, result);
-
 	if (host_byte(result) == DID_RESET) {
 		/* Third party bus reset or reset for error recovery
 		 * reasons.  Just retry the command and see what
-- 
2.11.0

WARNING: multiple messages have this Message-ID (diff)
From: hch@lst.de (Christoph Hellwig)
Subject: [PATCH 08/25] scsi: fix fast-fail for non-passthrough requests
Date: Thu,  6 Apr 2017 17:39:27 +0200	[thread overview]
Message-ID: <20170406153944.10058-9-hch@lst.de> (raw)
In-Reply-To: <20170406153944.10058-1-hch@lst.de>

Currently error is always 0 for non-passthrough requests when reaching the
scsi_noretry_cmd check in scsi_io_completion, which effectively disables
all fastfail logic.  Fix this by having a single call to
__scsi_error_from_host_byte at the beginning of the function and always
having a valid error value.

Signed-off-by: Christoph Hellwig <hch at lst.de>
---
 drivers/scsi/scsi_lib.c | 28 +++++++---------------------
 1 file changed, 7 insertions(+), 21 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 11972d1075f1..89b4d9e69866 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -779,21 +779,17 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 		sense_valid = scsi_command_normalize_sense(cmd, &sshdr);
 		if (sense_valid)
 			sense_deferred = scsi_sense_is_deferred(&sshdr);
+
+		if (!sense_deferred)
+			error = __scsi_error_from_host_byte(cmd, result);
 	}
 
 	if (blk_rq_is_passthrough(req)) {
-		if (result) {
-			if (sense_valid) {
-				/*
-				 * SG_IO wants current and deferred errors
-				 */
-				scsi_req(req)->sense_len =
-					min(8 + cmd->sense_buffer[7],
-					    SCSI_SENSE_BUFFERSIZE);
-			}
-			if (!sense_deferred)
-				error = __scsi_error_from_host_byte(cmd, result);
+		if (result && sense_valid) {
+			scsi_req(req)->sense_len = min(8 + cmd->sense_buffer[7],
+						       SCSI_SENSE_BUFFERSIZE);
 		}
+
 		/*
 		 * __scsi_error_from_host_byte may have reset the host_byte
 		 */
@@ -812,13 +808,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 				BUG();
 			return;
 		}
-	} else if (blk_rq_bytes(req) == 0 && result && !sense_deferred) {
-		/*
-		 * Flush commands do not transfers any data, and thus cannot use
-		 * good_bytes != blk_rq_bytes(req) as the signal for an error.
-		 * This sets the error explicitly for the problem case.
-		 */
-		error = __scsi_error_from_host_byte(cmd, result);
 	}
 
 	/* no bidi support for !blk_rq_is_passthrough yet */
@@ -848,7 +837,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 		else if (!(req->rq_flags & RQF_QUIET))
 			scsi_print_sense(cmd);
 		result = 0;
-		/* for passthrough error may be set */
 		error = 0;
 	}
 
@@ -877,8 +865,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 	if (result == 0)
 		goto requeue;
 
-	error = __scsi_error_from_host_byte(cmd, result);
-
 	if (host_byte(result) == DID_RESET) {
 		/* Third party bus reset or reset for error recovery
 		 * reasons.  Just retry the command and see what
-- 
2.11.0

  parent reply	other threads:[~2017-04-06 15:39 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-06 15:39 kill req->errors Christoph Hellwig
2017-04-06 15:39 ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 01/25] remove the mg_disk driver Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-13 19:58   ` Bart Van Assche
2017-04-13 19:58     ` Bart Van Assche
2017-04-13 19:58     ` Bart Van Assche
2017-04-14  8:21     ` hch
2017-04-14  8:21       ` hch
2017-04-06 15:39 ` [PATCH 02/25] block: remove the blk_execute_rq return value Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 18:38   ` Johannes Thumshirn
2017-04-06 18:38     ` Johannes Thumshirn
2017-04-06 18:38     ` Johannes Thumshirn
2017-04-13 20:03   ` Bart Van Assche
2017-04-13 20:03     ` Bart Van Assche
2017-04-13 20:03     ` Bart Van Assche
2017-04-14  8:22     ` hch
2017-04-14  8:22       ` hch
2017-04-17 16:01       ` Jens Axboe
2017-04-17 16:01         ` Jens Axboe
2017-04-18  7:50         ` hch
2017-04-18  7:50           ` hch
2017-04-18  7:50           ` hch
2017-04-06 15:39 ` [PATCH 03/25] nvme-fc: fix status code handling in nvme_fc_fcpio_done Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 18:50   ` Johannes Thumshirn
2017-04-06 18:50     ` Johannes Thumshirn
2017-04-06 18:50     ` Johannes Thumshirn
2017-04-06 15:39 ` [PATCH 04/25] nvme: split nvme status from block req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 18:47   ` Johannes Thumshirn
2017-04-06 18:47     ` Johannes Thumshirn
2017-04-06 18:47     ` Johannes Thumshirn
2017-04-06 15:39 ` [PATCH 05/25] nvme: make nvme_error_status private Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 06/25] virtio: fix spelling of virtblk_scsi_request_done Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 18:53   ` Johannes Thumshirn
2017-04-06 18:53     ` Johannes Thumshirn
2017-04-06 18:53     ` Johannes Thumshirn
2017-04-13 20:05   ` Bart Van Assche
2017-04-13 20:05     ` Bart Van Assche
2017-04-13 20:05     ` Bart Van Assche
2017-04-06 15:39 ` [PATCH 07/25] virtio_blk: don't use req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 18:55   ` Johannes Thumshirn
2017-04-06 18:55     ` Johannes Thumshirn
2017-04-06 18:55     ` Johannes Thumshirn
2017-04-06 15:39 ` Christoph Hellwig [this message]
2017-04-06 15:39   ` [PATCH 08/25] scsi: fix fast-fail for non-passthrough requests Christoph Hellwig
2017-04-13 20:41   ` Bart Van Assche
2017-04-13 20:41     ` Bart Van Assche
2017-04-13 20:41     ` Bart Van Assche
2017-04-06 15:39 ` [PATCH 09/25] scsi: introduce a new result field in struct scsi_request Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 10/25] loop: zero-fill bio on the submitting cpu Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-12 10:24   ` Ming Lei
2017-04-12 10:24     ` Ming Lei
2017-04-06 15:39 ` [PATCH 11/25] null_blk: don't pass always-0 req->errors to blk_mq_complete_request Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 12/25] dm rq: don't pass irrelevant error code " Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 13/25] dm mpath: don't check for req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 14/25] nbd: don't use req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 21:11   ` Josef Bacik
2017-04-06 21:11     ` Josef Bacik
2017-04-06 15:39 ` [PATCH 15/25] mtip32xx: add a status field to struct mtip_cmd Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 16/25] xen-blkfront: don't use req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-18 15:00   ` Roger Pau Monné
2017-04-18 15:00     ` Roger Pau Monné
2017-04-18 15:00     ` Roger Pau Monné
2017-04-18 15:05     ` Konrad Rzeszutek Wilk
2017-04-18 15:05       ` Konrad Rzeszutek Wilk
2017-04-18 15:05       ` Konrad Rzeszutek Wilk
2017-04-06 15:39 ` [PATCH 17/25] blk-mq: remove the error argument to blk_mq_complete_request Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-18 15:03   ` Roger Pau Monné
2017-04-18 15:03     ` Roger Pau Monné
2017-04-18 15:03     ` Roger Pau Monné
2017-04-18 15:06     ` Konrad Rzeszutek Wilk
2017-04-18 15:06       ` Konrad Rzeszutek Wilk
2017-04-18 15:06       ` Konrad Rzeszutek Wilk
2017-04-06 15:39 ` [PATCH 18/25] blk-mq: simplify __blk_mq_complete_request Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 19/25] block: add a error_count field to struct request Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 20/25] floppy: switch from req->errors to req->error_count Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 21/25] ataflop: " Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 22/25] swim3: remove (commented out) printing of req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 23/25] pd: remove bogus check for req->errors Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 24/25] blktrace: remove the unused block_rq_abort tracepoint Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 15:39 ` [PATCH 25/25] block: remove the errors field from struct request Christoph Hellwig
2017-04-06 15:39   ` Christoph Hellwig
2017-04-06 20:00 ` kill req->errors Konrad Rzeszutek Wilk
2017-04-06 20:00   ` Konrad Rzeszutek Wilk
2017-04-07  7:11   ` Christoph Hellwig
2017-04-07  7:11     ` Christoph Hellwig
2017-04-18 14:33     ` Konrad Rzeszutek Wilk
2017-04-18 14:33       ` Konrad Rzeszutek Wilk
2017-04-12  8:37   ` Christoph Hellwig
2017-04-12  8:37     ` Christoph Hellwig
2017-04-12  8:38 ` Christoph Hellwig
2017-04-12  8:38   ` Christoph Hellwig
2017-04-18  0:59   ` Guan Junxiong

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=20170406153944.10058-9-hch@lst.de \
    --to=hch@lst.de \
    --cc=axboe@kernel.dk \
    --cc=dm-devel@redhat.com \
    --cc=james.smart@broadcom.com \
    --cc=jbacik@fb.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=roger.pau@citrix.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.