On 8/8/22 17:04, Mike Christie wrote: > This adds a helper to execute the Reservation Report. The next patches > will then convert call it and convert that info to read_keys and > read_reservation. > > Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx> > --- > drivers/nvme/host/core.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c > index 0dc768ae0c16..6b22a5dec122 100644 > --- a/drivers/nvme/host/core.c > +++ b/drivers/nvme/host/core.c > @@ -2196,6 +2196,33 @@ static int nvme_pr_release(struct block_device *bdev, u64 key, enum pr_type type > return nvme_pr_command(bdev, cdw10, key, 0, nvme_cmd_resv_release); > } > > +static int nvme_pr_resv_report(struct block_device *bdev, u8 *data, > + u32 data_len, bool *eds) > +{ > + struct nvme_command c = { }; > + int ret; > + > + c.common.opcode = nvme_cmd_resv_report; > + c.common.cdw10 = cpu_to_le32(nvme_bytes_to_numd(data_len)); > + c.common.cdw11 = 1; > + *eds = true; > + > +retry: > + if (IS_ENABLED(CONFIG_NVME_MULTIPATH) && > + bdev->bd_disk->fops == &nvme_ns_head_ops) > + ret = nvme_send_ns_head_pr_command(bdev, &c, data, data_len); > + else > + ret = nvme_send_ns_pr_command(bdev->bd_disk->private_data, &c, > + data, data_len); > + if (ret == NVME_SC_HOST_ID_INCONSIST && c.common.cdw11) { > + c.common.cdw11 = 0; > + *eds = false; > + goto retry; Unconditional retries without any limit can create problems, perhaps consider adding some soft limits. -ck