nvme: Convert NVMe errors to PR errors
This converts the NVMe errors we commonly see during PR handling to PR_STS errors or -Exyz errors. pr_ops callers can then handle SCSI and NVMe errors without knowing the device types. Signed-off-by: Mike Christie <michael.christie@oracle.com> Link: https://lore.kernel.org/r/20221122032603.32766-5-michael.christie@oracle.com Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
04b3c8c002
commit
7fb42780d0
1 changed files with 31 additions and 2 deletions
|
@ -2104,11 +2104,34 @@ static int nvme_send_ns_pr_command(struct nvme_ns *ns, struct nvme_command *c,
|
||||||
return nvme_submit_sync_cmd(ns->queue, c, data, 16);
|
return nvme_submit_sync_cmd(ns->queue, c, data, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nvme_sc_to_pr_err(int nvme_sc)
|
||||||
|
{
|
||||||
|
if (nvme_is_path_error(nvme_sc))
|
||||||
|
return PR_STS_PATH_FAILED;
|
||||||
|
|
||||||
|
switch (nvme_sc) {
|
||||||
|
case NVME_SC_SUCCESS:
|
||||||
|
return PR_STS_SUCCESS;
|
||||||
|
case NVME_SC_RESERVATION_CONFLICT:
|
||||||
|
return PR_STS_RESERVATION_CONFLICT;
|
||||||
|
case NVME_SC_ONCS_NOT_SUPPORTED:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
case NVME_SC_BAD_ATTRIBUTES:
|
||||||
|
case NVME_SC_INVALID_OPCODE:
|
||||||
|
case NVME_SC_INVALID_FIELD:
|
||||||
|
case NVME_SC_INVALID_NS:
|
||||||
|
return -EINVAL;
|
||||||
|
default:
|
||||||
|
return PR_STS_IOERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int nvme_pr_command(struct block_device *bdev, u32 cdw10,
|
static int nvme_pr_command(struct block_device *bdev, u32 cdw10,
|
||||||
u64 key, u64 sa_key, u8 op)
|
u64 key, u64 sa_key, u8 op)
|
||||||
{
|
{
|
||||||
struct nvme_command c = { };
|
struct nvme_command c = { };
|
||||||
u8 data[16] = { 0, };
|
u8 data[16] = { 0, };
|
||||||
|
int ret;
|
||||||
|
|
||||||
put_unaligned_le64(key, &data[0]);
|
put_unaligned_le64(key, &data[0]);
|
||||||
put_unaligned_le64(sa_key, &data[8]);
|
put_unaligned_le64(sa_key, &data[8]);
|
||||||
|
@ -2118,8 +2141,14 @@ static int nvme_pr_command(struct block_device *bdev, u32 cdw10,
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_NVME_MULTIPATH) &&
|
if (IS_ENABLED(CONFIG_NVME_MULTIPATH) &&
|
||||||
bdev->bd_disk->fops == &nvme_ns_head_ops)
|
bdev->bd_disk->fops == &nvme_ns_head_ops)
|
||||||
return nvme_send_ns_head_pr_command(bdev, &c, data);
|
ret = nvme_send_ns_head_pr_command(bdev, &c, data);
|
||||||
return nvme_send_ns_pr_command(bdev->bd_disk->private_data, &c, data);
|
else
|
||||||
|
ret = nvme_send_ns_pr_command(bdev->bd_disk->private_data, &c,
|
||||||
|
data);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return nvme_sc_to_pr_err(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nvme_pr_register(struct block_device *bdev, u64 old,
|
static int nvme_pr_register(struct block_device *bdev, u64 old,
|
||||||
|
|
Loading…
Add table
Reference in a new issue