@@ -1686,7 +1686,8 @@ static int sd_get_unique_id(struct gendisk *disk, u8 id[16],
#define SCSI_PR_UA_RETRIES 5
static int sd_pr_in_command(struct block_device *bdev, u8 sa,
- unsigned char *data, int data_len)
+ unsigned char *data, int data_len,
+ blk_status_t *blk_stat)
{
struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk);
struct scsi_device *sdev = sdkp->device;
@@ -1710,6 +1711,9 @@ static int sd_pr_in_command(struct block_device *bdev, u8 sa,
scsi_print_sense_hdr(sdev, NULL, &sshdr);
}
+ if (blk_stat && result >= 0)
+ *blk_stat = scsi_result_to_blk_status(result);
+
return result;
}
@@ -1724,7 +1728,7 @@ static int sd_pr_read_keys(struct block_device *bdev, struct pr_keys *keys_info,
if (!data)
return -ENOMEM;
- result = sd_pr_in_command(bdev, READ_KEYS, data, data_len);
+ result = sd_pr_in_command(bdev, READ_KEYS, data, data_len, blk_stat);
if (result)
goto free_data;
@@ -1753,7 +1757,8 @@ static int sd_pr_read_reservation(struct block_device *bdev,
u8 data[24] = { 0, };
int result, len;
- result = sd_pr_in_command(bdev, READ_RESERVATION, data, sizeof(data));
+ result = sd_pr_in_command(bdev, READ_RESERVATION, data, sizeof(data),
+ blk_stat);
if (result)
return result;
@@ -1777,7 +1782,7 @@ static int sd_pr_read_reservation(struct block_device *bdev,
}
static int sd_pr_out_command(struct block_device *bdev, u8 sa, u64 key,
- u64 sa_key, u8 type, u8 flags)
+ u64 sa_key, u8 type, u8 flags, blk_status_t *blk_stat)
{
struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk);
struct scsi_device *sdev = sdkp->device;
@@ -1808,6 +1813,9 @@ static int sd_pr_out_command(struct block_device *bdev, u8 sa, u64 key,
scsi_print_sense_hdr(sdev, NULL, &sshdr);
}
+ if (blk_stat && result >= 0)
+ *blk_stat = scsi_result_to_blk_status(result);
+
return result;
}
@@ -1818,7 +1826,8 @@ static int sd_pr_register(struct block_device *bdev, u64 old_key, u64 new_key,
return -EOPNOTSUPP;
return sd_pr_out_command(bdev, (flags & PR_FL_IGNORE_KEY) ? 0x06 : 0x00,
old_key, new_key, 0,
- (1 << 0) /* APTPL */);
+ (1 << 0) /* APTPL */,
+ blk_stat);
}
static int sd_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type,
@@ -1827,27 +1836,27 @@ static int sd_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type,
if (flags)
return -EOPNOTSUPP;
return sd_pr_out_command(bdev, 0x01, key, 0,
- block_pr_type_to_scsi(type), 0);
+ block_pr_type_to_scsi(type), 0, blk_stat);
}
static int sd_pr_release(struct block_device *bdev, u64 key, enum pr_type type,
blk_status_t *blk_stat)
{
return sd_pr_out_command(bdev, 0x02, key, 0,
- block_pr_type_to_scsi(type), 0);
+ block_pr_type_to_scsi(type), 0, blk_stat);
}
static int sd_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key,
enum pr_type type, bool abort, blk_status_t *blk_stat)
{
return sd_pr_out_command(bdev, abort ? 0x05 : 0x04, old_key, new_key,
- block_pr_type_to_scsi(type), 0);
+ block_pr_type_to_scsi(type), 0, blk_stat);
}
static int sd_pr_clear(struct block_device *bdev, u64 key,
blk_status_t *blk_stat)
{
- return sd_pr_out_command(bdev, 0x03, key, 0, 0, 0);
+ return sd_pr_out_command(bdev, 0x03, key, 0, 0, 0, blk_stat);
}
static const struct pr_ops sd_pr_ops = {
This patch has the sd pr_ops convert from the low level SCSI errors to a blk_status_t. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/sd.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)