[dm-devel] [PATCH] scsi: Introduce REQ_SCSI_ERROR flag

Hannes Reinecke hare at suse.de
Fri Nov 20 07:52:40 UTC 2009


When evaluating req->errors we have to know which
subsystem generated them in order to process them correctly.
This patch introduces a REQ_SCSI_ERROR flag to indicate
that the errors field in the request contains a SCSI result.

Signed-off-by: Hannes Reinecke <hare at suse.de>

diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index e5a3884..ccba32d 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -1258,9 +1258,12 @@ static int do_end_io(struct multipath *m, struct request *clone,
 	if (error == -EOPNOTSUPP)
 		return error;
 
-	r = eval_scsi_error(clone->errors, clone->sense, clone->sense_len);
-	if (r != DM_ENDIO_REQUEUE)
-		return r;
+	if (blk_rq_scsi_error(clone)) {
+		r = eval_scsi_error(clone->errors, clone->sense,
+				    clone->sense_len);
+		if (r != DM_ENDIO_REQUEUE)
+			return r;
+	}
 
 	if (mpio->pgpath)
 		fail_path(mpio->pgpath);
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 10aa084..e878fc5 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -723,6 +723,8 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
 	}
 
 	req->errors = result;
+	req->cmd_flags |= REQ_SCSI_ERROR;
+
 	if (sense_valid && req->sense) {
 		int len = 8 + cmd->sense_buffer[7];
 
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 221cecd..dbc3302 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -115,6 +115,7 @@ enum rq_flag_bits {
 	__REQ_NOIDLE,		/* Don't anticipate more IO after this one */
 	__REQ_IO_STAT,		/* account I/O stat */
 	__REQ_MIXED_MERGE,	/* merge of different types, fail separately */
+	__REQ_SCSI_ERROR,	/* errors are SCSI result codes */
 	__REQ_NR_BITS,		/* stops here */
 };
 
@@ -144,6 +145,7 @@ enum rq_flag_bits {
 #define REQ_NOIDLE	(1 << __REQ_NOIDLE)
 #define REQ_IO_STAT	(1 << __REQ_IO_STAT)
 #define REQ_MIXED_MERGE	(1 << __REQ_MIXED_MERGE)
+#define REQ_SCSI_ERROR	(1 << __REQ_SCSI_ERROR)
 
 #define REQ_FAILFAST_MASK	(REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | \
 				 REQ_FAILFAST_DRIVER)
@@ -606,6 +608,7 @@ enum {
 #define blk_rq_started(rq)	((rq)->cmd_flags & REQ_STARTED)
 #define blk_rq_io_stat(rq)	((rq)->cmd_flags & REQ_IO_STAT)
 #define blk_rq_quiet(rq)	((rq)->cmd_flags & REQ_QUIET)
+#define blk_rq_scsi_error(rq)	((rq)->cmd_flags & REQ_SCSI_ERROR)
 
 #define blk_account_rq(rq)	(blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq))) 
 




More information about the dm-devel mailing list