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.chris...@oracle.com>
---
 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;
+       }
+
+       return ret;
+}
+
 const struct pr_ops nvme_pr_ops = {
        .pr_register    = nvme_pr_register,
        .pr_reserve     = nvme_pr_reserve,
-- 
2.18.2

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to