From: Martin Wilck <mwilck@xxxxxxxx> This helper converts the SCSI result in a sg_io_hdr struct to a blk_status_t. It will be used in the SG_IO code path for dm-multipath. Putting it into scsi_ioctl.c avoids open-coding SCSI specific code in the dm layer. Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> --- block/scsi_ioctl.c | 20 ++++++++++++++++++++ include/linux/blkdev.h | 1 + 2 files changed, 21 insertions(+) diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 19b63b64ecbc..e061398be90f 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -929,6 +929,26 @@ blk_status_t __scsi_result_to_blk_status(int *cmd_result, int result) } EXPORT_SYMBOL(__scsi_result_to_blk_status); +blk_status_t sg_io_to_blk_status(struct sg_io_hdr *hdr) +{ + int result; + blk_status_t sts; + + if (!(hdr->info & SG_INFO_CHECK)) + return BLK_STS_OK; + + result = hdr->status | + (hdr->msg_status << 8) | + (hdr->host_status << 16) | + (hdr->driver_status << 24); + + sts = __scsi_result_to_blk_status(&result, result); + hdr->host_status = host_byte(result); + + return sts; +} +EXPORT_SYMBOL(sg_io_to_blk_status); + static int __init blk_scsi_ioctl_init(void) { blk_set_cmd_filter_defaults(&blk_default_cmd_filter); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 48497a77428d..5da03edf125c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -2022,4 +2022,5 @@ 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); +blk_status_t sg_io_to_blk_status(struct sg_io_hdr *hdr); #endif /* _LINUX_BLKDEV_H */ -- 2.32.0