From: mwilck@suse.com To: Mike Snitzer <snitzer@redhat.com>, Alasdair G Kergon <agk@redhat.com>, Bart Van Assche <Bart.VanAssche@sandisk.com>, "Martin K. Petersen" <martin.petersen@oracle.com>, linux-scsi@vger.kernel.org, dm-devel@redhat.com, Hannes Reinecke <hare@suse.de>, Christoph Hellwig <hch@lst.de> Cc: Daniel Wagner <dwagner@suse.de>, linux-block@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>, Benjamin Marzinski <bmarzins@redhat.com>, nkoenig@redhat.com, emilne@redhat.com, Martin Wilck <mwilck@suse.com> Subject: [PATCH v5 1/3] scsi: scsi_ioctl: export __scsi_result_to_blk_status() Date: Mon, 28 Jun 2021 17:15:56 +0200 [thread overview] Message-ID: <20210628151558.2289-2-mwilck@suse.com> (raw) In-Reply-To: <20210628151558.2289-1-mwilck@suse.com> From: Martin Wilck <mwilck@suse.com> This makes it possible to use scsi_result_to_blk_status() from code that shouldn't depend on scsi_mod (e.g. device mapper). scsi_ioctl.c is selected by CONFIG_BLK_SCSI_REQUEST, which is automatically selected by CONFIG_SCSI. Signed-off-by: Martin Wilck <mwilck@suse.com> --- block/scsi_ioctl.c | 47 +++++++++++++++++++++++++++++++++++++++++ drivers/scsi/scsi_lib.c | 24 +-------------------- include/linux/blkdev.h | 1 + 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index fa6df11b8bdd..19b63b64ecbc 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -882,6 +882,53 @@ void scsi_req_init(struct scsi_request *req) } EXPORT_SYMBOL(scsi_req_init); +/* See set_host_byte() in include/scsi/scsi_cmnd.h */ +static void __set_host_byte(int *result, char status) +{ + *result = (*result & 0xff00ffff) | (status << 16); +} + +/** + * __scsi_result_to_blk_status - translate a SCSI result code into blk_status_t + * @cmd: SCSI command + * @cmd_result: pointer to scsi cmnd result code to be possibly changed + * + * Translate a SCSI result code into a blk_status_t value. May reset the host + * byte of @cmd_result. + */ +blk_status_t __scsi_result_to_blk_status(int *cmd_result, int result) +{ + switch (host_byte(result)) { + case DID_OK: + /* + * Also check the other bytes than the status byte in result + * to handle the case when a SCSI LLD sets result to + * DRIVER_SENSE << 24 without setting SAM_STAT_CHECK_CONDITION. + */ + if (scsi_status_is_good(result)) + return BLK_STS_OK; + return BLK_STS_IOERR; + case DID_TRANSPORT_FAILFAST: + case DID_TRANSPORT_MARGINAL: + return BLK_STS_TRANSPORT; + case DID_TARGET_FAILURE: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_TARGET; + case DID_NEXUS_FAILURE: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_NEXUS; + case DID_ALLOC_FAILURE: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_NOSPC; + case DID_MEDIUM_ERROR: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_MEDIUM; + default: + return BLK_STS_IOERR; + } +} +EXPORT_SYMBOL(__scsi_result_to_blk_status); + static int __init blk_scsi_ioctl_init(void) { blk_set_cmd_filter_defaults(&blk_default_cmd_filter); diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 6b994baf87c2..2c0eca3693af 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -589,29 +589,7 @@ static bool scsi_end_request(struct request *req, blk_status_t error, */ static blk_status_t scsi_result_to_blk_status(struct scsi_cmnd *cmd, int result) { - switch (host_byte(result)) { - case DID_OK: - if (scsi_status_is_good(result)) - return BLK_STS_OK; - return BLK_STS_IOERR; - case DID_TRANSPORT_FAILFAST: - case DID_TRANSPORT_MARGINAL: - return BLK_STS_TRANSPORT; - case DID_TARGET_FAILURE: - set_host_byte(cmd, DID_OK); - return BLK_STS_TARGET; - case DID_NEXUS_FAILURE: - set_host_byte(cmd, DID_OK); - return BLK_STS_NEXUS; - case DID_ALLOC_FAILURE: - set_host_byte(cmd, DID_OK); - return BLK_STS_NOSPC; - case DID_MEDIUM_ERROR: - set_host_byte(cmd, DID_OK); - return BLK_STS_MEDIUM; - default: - return BLK_STS_IOERR; - } + return __scsi_result_to_blk_status(&cmd->result, result); } /* Helper for scsi_io_completion() when "reprep" action required. */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 1255823b2bc0..48497a77428d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -2021,4 +2021,5 @@ int fsync_bdev(struct block_device *bdev); int freeze_bdev(struct block_device *bdev); int thaw_bdev(struct block_device *bdev); +blk_status_t __scsi_result_to_blk_status(int *cmd_result, int result); #endif /* _LINUX_BLKDEV_H */ -- 2.32.0
WARNING: multiple messages have this Message-ID (diff)
From: mwilck@suse.com To: Mike Snitzer <snitzer@redhat.com>, Alasdair G Kergon <agk@redhat.com>, Bart Van Assche <Bart.VanAssche@sandisk.com>, "Martin K. Petersen" <martin.petersen@oracle.com>, linux-scsi@vger.kernel.org, dm-devel@redhat.com, Hannes Reinecke <hare@suse.de>, Christoph Hellwig <hch@lst.de> Cc: Daniel Wagner <dwagner@suse.de>, emilne@redhat.com, linux-block@vger.kernel.org, nkoenig@redhat.com, Paolo Bonzini <pbonzini@redhat.com>, Martin Wilck <mwilck@suse.com> Subject: [dm-devel] [PATCH v5 1/3] scsi: scsi_ioctl: export __scsi_result_to_blk_status() Date: Mon, 28 Jun 2021 17:15:56 +0200 [thread overview] Message-ID: <20210628151558.2289-2-mwilck@suse.com> (raw) In-Reply-To: <20210628151558.2289-1-mwilck@suse.com> From: Martin Wilck <mwilck@suse.com> This makes it possible to use scsi_result_to_blk_status() from code that shouldn't depend on scsi_mod (e.g. device mapper). scsi_ioctl.c is selected by CONFIG_BLK_SCSI_REQUEST, which is automatically selected by CONFIG_SCSI. Signed-off-by: Martin Wilck <mwilck@suse.com> --- block/scsi_ioctl.c | 47 +++++++++++++++++++++++++++++++++++++++++ drivers/scsi/scsi_lib.c | 24 +-------------------- include/linux/blkdev.h | 1 + 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index fa6df11b8bdd..19b63b64ecbc 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -882,6 +882,53 @@ void scsi_req_init(struct scsi_request *req) } EXPORT_SYMBOL(scsi_req_init); +/* See set_host_byte() in include/scsi/scsi_cmnd.h */ +static void __set_host_byte(int *result, char status) +{ + *result = (*result & 0xff00ffff) | (status << 16); +} + +/** + * __scsi_result_to_blk_status - translate a SCSI result code into blk_status_t + * @cmd: SCSI command + * @cmd_result: pointer to scsi cmnd result code to be possibly changed + * + * Translate a SCSI result code into a blk_status_t value. May reset the host + * byte of @cmd_result. + */ +blk_status_t __scsi_result_to_blk_status(int *cmd_result, int result) +{ + switch (host_byte(result)) { + case DID_OK: + /* + * Also check the other bytes than the status byte in result + * to handle the case when a SCSI LLD sets result to + * DRIVER_SENSE << 24 without setting SAM_STAT_CHECK_CONDITION. + */ + if (scsi_status_is_good(result)) + return BLK_STS_OK; + return BLK_STS_IOERR; + case DID_TRANSPORT_FAILFAST: + case DID_TRANSPORT_MARGINAL: + return BLK_STS_TRANSPORT; + case DID_TARGET_FAILURE: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_TARGET; + case DID_NEXUS_FAILURE: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_NEXUS; + case DID_ALLOC_FAILURE: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_NOSPC; + case DID_MEDIUM_ERROR: + __set_host_byte(cmd_result, DID_OK); + return BLK_STS_MEDIUM; + default: + return BLK_STS_IOERR; + } +} +EXPORT_SYMBOL(__scsi_result_to_blk_status); + static int __init blk_scsi_ioctl_init(void) { blk_set_cmd_filter_defaults(&blk_default_cmd_filter); diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 6b994baf87c2..2c0eca3693af 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -589,29 +589,7 @@ static bool scsi_end_request(struct request *req, blk_status_t error, */ static blk_status_t scsi_result_to_blk_status(struct scsi_cmnd *cmd, int result) { - switch (host_byte(result)) { - case DID_OK: - if (scsi_status_is_good(result)) - return BLK_STS_OK; - return BLK_STS_IOERR; - case DID_TRANSPORT_FAILFAST: - case DID_TRANSPORT_MARGINAL: - return BLK_STS_TRANSPORT; - case DID_TARGET_FAILURE: - set_host_byte(cmd, DID_OK); - return BLK_STS_TARGET; - case DID_NEXUS_FAILURE: - set_host_byte(cmd, DID_OK); - return BLK_STS_NEXUS; - case DID_ALLOC_FAILURE: - set_host_byte(cmd, DID_OK); - return BLK_STS_NOSPC; - case DID_MEDIUM_ERROR: - set_host_byte(cmd, DID_OK); - return BLK_STS_MEDIUM; - default: - return BLK_STS_IOERR; - } + return __scsi_result_to_blk_status(&cmd->result, result); } /* Helper for scsi_io_completion() when "reprep" action required. */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 1255823b2bc0..48497a77428d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -2021,4 +2021,5 @@ int fsync_bdev(struct block_device *bdev); int freeze_bdev(struct block_device *bdev); int thaw_bdev(struct block_device *bdev); +blk_status_t __scsi_result_to_blk_status(int *cmd_result, int result); #endif /* _LINUX_BLKDEV_H */ -- 2.32.0 -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
next prev parent reply other threads:[~2021-06-28 15:20 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-28 15:15 [PATCH v5 0/3] scsi/dm: dm_blk_ioctl(): implement failover for SG_IO on dm-multipath mwilck 2021-06-28 15:15 ` [dm-devel] " mwilck 2021-06-28 15:15 ` mwilck [this message] 2021-06-28 15:15 ` [dm-devel] [PATCH v5 1/3] scsi: scsi_ioctl: export __scsi_result_to_blk_status() mwilck 2021-06-28 15:15 ` [PATCH v5 2/3] scsi: scsi_ioctl: add sg_io_to_blk_status() mwilck 2021-06-28 15:15 ` [dm-devel] " mwilck 2021-06-28 15:15 ` [PATCH v5 3/3] dm mpath: add CONFIG_DM_MULTIPATH_SG_IO - failover for SG_IO mwilck 2021-06-28 15:15 ` [dm-devel] " mwilck 2021-07-01 7:56 ` Christoph Hellwig 2021-07-01 7:56 ` [dm-devel] " Christoph Hellwig 2021-07-01 10:35 ` Martin Wilck 2021-07-01 10:35 ` [dm-devel] " Martin Wilck 2021-07-01 11:34 ` Christoph Hellwig 2021-07-01 11:34 ` [dm-devel] " Christoph Hellwig 2021-07-02 14:21 ` Martin Wilck 2021-07-02 14:21 ` Martin Wilck 2021-07-05 13:02 ` Paolo Bonzini 2021-07-05 13:02 ` Paolo Bonzini 2021-07-05 13:11 ` Hannes Reinecke 2021-07-05 13:11 ` Hannes Reinecke 2021-07-05 13:48 ` Martin Wilck 2021-07-05 13:48 ` Martin Wilck 2021-07-06 10:13 ` Paolo Bonzini 2021-07-06 10:13 ` Paolo Bonzini 2021-07-01 11:06 ` Paolo Bonzini 2021-07-01 11:06 ` [dm-devel] " Paolo Bonzini
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=20210628151558.2289-2-mwilck@suse.com \ --to=mwilck@suse.com \ --cc=Bart.VanAssche@sandisk.com \ --cc=agk@redhat.com \ --cc=bmarzins@redhat.com \ --cc=dm-devel@redhat.com \ --cc=dwagner@suse.de \ --cc=emilne@redhat.com \ --cc=hare@suse.de \ --cc=hch@lst.de \ --cc=linux-block@vger.kernel.org \ --cc=linux-scsi@vger.kernel.org \ --cc=martin.petersen@oracle.com \ --cc=nkoenig@redhat.com \ --cc=pbonzini@redhat.com \ --cc=snitzer@redhat.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: linkBe 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.