@@ -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);
@@ -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 */