On 10/30/22 3:17 AM, Christoph Hellwig wrote: > On Wed, Oct 26, 2022 at 06:19:35PM -0500, Mike Christie wrote: >> This patch adds support for the pr_ops read_keys callout by calling the >> NVMe Reservation Report helper, then parsing that info to get the >> controller's registered keys. Because the callout is only used in the >> kernel where the callers do not know about controller/host IDs, the >> callout just returns the registered keys which is required by the SCSI PR >> in READ KEYS command. >> >> Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx> >> --- >> drivers/nvme/host/pr.c | 73 ++++++++++++++++++++++++++++++++++++++++++ >> include/linux/nvme.h | 4 +++ >> 2 files changed, 77 insertions(+) >> >> diff --git a/drivers/nvme/host/pr.c b/drivers/nvme/host/pr.c >> index aa88c55879b2..df7eb2440c67 100644 >> --- a/drivers/nvme/host/pr.c >> +++ b/drivers/nvme/host/pr.c >> @@ -118,10 +118,83 @@ 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) > > Is there any good reason this method seems to take a u8 instead of a void > pointer? As that seems to make a few things a bit messy. I did it because the helper functions nvme_send_ns_head_pr_command/ nvme_send_ns_pr_command took a u8. Looking at it some more I see those functions use nvme_submit_sync_cmd which then takes a avoid pointer. To handle your comment about the helper below I'll fix all that up to take a void pointer. > >> + 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); > > Can you please add a hlper for this logic? Will do. > >> + for (i = 0; i < num_ret_keys; i++) { >> + if (eds) { >> + keys_info->keys[i] = >> + le64_to_cpu(status->regctl_eds[i].rkey); >> + } else { >> + keys_info->keys[i] = >> + le64_to_cpu(status->regctl_ds[i].rkey); >> + } > > If you shorten the status variable name to something like rs this becomes > much easier to follow :) Will do.