]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
Use argument structure for nvme_zns_mgmt_send() and nvme_zns_mgmt_recv()
authorHannes Reinecke <hare@suse.de>
Fri, 17 Dec 2021 07:03:42 +0000 (08:03 +0100)
committerDaniel Wagner <dwagner@suse.de>
Mon, 10 Jan 2022 16:55:18 +0000 (17:55 +0100)
Use an argument structure instead of passing all arguments one by one.
This allows for a future expansion of the argument list without having
to change the library ABI.
Also convert zns.c to use nvme_zns_report_zones() instead of calling
nvme_zns_mgmt_recv() directly.

Signed-off-by: Hannes Reinecke <hare@suse.de>
src/nvme/ioctl.c
src/nvme/ioctl.h
test/zns.c

index 9973919de4b9bda954a65bcdd85df7b89dff073e..531763c206f8eece2ce250ec8260a087122034a4 100644 (file)
@@ -1715,74 +1715,54 @@ int nvme_resv_report(struct nvme_resv_report_args *args)
        return nvme_submit_io_passthru(args->fd, &cmd, args->result);
 }
 
-int nvme_zns_mgmt_send(int fd, __u32 nsid, __u64 slba,
-                      enum nvme_zns_send_action zsa, bool select_all,
-                      __u8 zsaso, __u32 data_len,
-                      void *data, __u32 timeout, __u32 *result)
+int nvme_zns_mgmt_send(struct nvme_zns_mgmt_send_args *args)
 {
-       __u32 cdw10 = slba & 0xffffffff;
-       __u32 cdw11 = slba >> 32;
-       __u32 cdw13 = NVME_SET(zsaso, ZNS_MGMT_SEND_ZSASO) |
-                       NVME_SET(!!select_all, ZNS_MGMT_SEND_SEL) |
-                       NVME_SET(zsa, ZNS_MGMT_SEND_ZSA);
+       __u32 cdw10 = args->slba & 0xffffffff;
+       __u32 cdw11 = args->slba >> 32;
+       __u32 cdw13 = NVME_SET(args->zsaso, ZNS_MGMT_SEND_ZSASO) |
+                       NVME_SET(!!args->select_all, ZNS_MGMT_SEND_SEL) |
+                       NVME_SET(args->zsa, ZNS_MGMT_SEND_ZSA);
 
        struct nvme_passthru_cmd cmd = {
                .opcode         = nvme_zns_cmd_mgmt_send,
-               .nsid           = nsid,
+               .nsid           = args->nsid,
                .cdw10          = cdw10,
                .cdw11          = cdw11,
                .cdw13          = cdw13,
-               .addr           = (__u64)(uintptr_t)data,
-               .data_len       = data_len,
-               .timeout_ms     = timeout,
+               .addr           = (__u64)(uintptr_t)args->data,
+               .data_len       = args->data_len,
+               .timeout_ms     = args->timeout,
        };
 
-       return nvme_submit_io_passthru(fd, &cmd, result);
+       if (args->args_size < sizeof(*args))
+               return -EINVAL;
+       return nvme_submit_io_passthru(args->fd, &cmd, args->result);
 }
 
-int nvme_zns_mgmt_recv(int fd, __u32 nsid, __u64 slba,
-                      enum nvme_zns_recv_action zra, __u16 zrasf,
-                      bool zras_feat, __u32 data_len, void *data,
-                      __u32 timeout, __u32 *result)
+int nvme_zns_mgmt_recv(struct nvme_zns_mgmt_recv_args *args)
 {
-       __u32 cdw10 = slba & 0xffffffff;
-       __u32 cdw11 = slba >> 32;
-       __u32 cdw12 = (data_len >> 2) - 1;
-       __u32 cdw13 = NVME_SET(zra, ZNS_MGMT_RECV_ZRA) |
-                       NVME_SET(zrasf, ZNS_MGMT_RECV_ZRASF) |
-                       NVME_SET(zras_feat, ZNS_MGMT_RECV_ZRAS_FEAT);
+       __u32 cdw10 = args->slba & 0xffffffff;
+       __u32 cdw11 = args->slba >> 32;
+       __u32 cdw12 = (args->data_len >> 2) - 1;
+       __u32 cdw13 = NVME_SET(args->zra, ZNS_MGMT_RECV_ZRA) |
+                       NVME_SET(args->zrasf, ZNS_MGMT_RECV_ZRASF) |
+                       NVME_SET(args->zras_feat, ZNS_MGMT_RECV_ZRAS_FEAT);
 
        struct nvme_passthru_cmd cmd = {
                .opcode         = nvme_zns_cmd_mgmt_recv,
-               .nsid           = nsid,
+               .nsid           = args->nsid,
                .cdw10          = cdw10,
                .cdw11          = cdw11,
                .cdw12          = cdw12,
                .cdw13          = cdw13,
-               .addr           = (__u64)(uintptr_t)data,
-               .data_len       = data_len,
-               .timeout_ms     = timeout,
+               .addr           = (__u64)(uintptr_t)args->data,
+               .data_len       = args->data_len,
+               .timeout_ms     = args->timeout,
        };
 
-       return nvme_submit_io_passthru(fd, &cmd, result);
-}
-
-int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba,
-                         enum nvme_zns_report_options opts,
-                         bool extended, bool partial,
-                         __u32 data_len, void *data,
-                         __u32 timeout, __u32 *result)
-{
-       BUILD_ASSERT(sizeof(struct nvme_zns_desc) == 64);
-       enum nvme_zns_recv_action zra;
-
-       if (extended)
-               zra = NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES;
-       else
-               zra = NVME_ZNS_ZRA_REPORT_ZONES;
-
-       return nvme_zns_mgmt_recv(fd, nsid, slba, zra, opts, partial,
-                                 data_len, data, timeout, result);
+       if (args->args_size < sizeof(*args))
+               return -EINVAL;
+       return nvme_submit_io_passthru(args->fd, &cmd, args->result);
 }
 
 int nvme_zns_append(int fd, __u32 nsid, __u64 zslba, __u16 nlb, __u16 control,
index 3f52887288a034ce143743334f29151d519d7394..42604ca92a0de5aff846ab2ca7cc8e3dd7f21dac 100644 (file)
@@ -3942,7 +3942,7 @@ struct nvme_resv_report_args {
 int nvme_resv_report(struct nvme_resv_report_args *args);
 
 /**
- * nvme_zns_mgmt_send() -
+ * nvme_zns_mgmt_send_args - Arguments for the NVMe ZNS Management Send command
  * @fd:                File descriptor of nvme device
  * @nsid:      Namespace ID
  * @slba:      Starting logical block address
@@ -3953,18 +3953,33 @@ int nvme_resv_report(struct nvme_resv_report_args *args);
  * @data:      Userspace address of the data
  * @timeout:   timeout in ms
  * @result:    The command completion result from CQE dword0
+ */
+struct nvme_zns_mgmt_send_args {
+       int args_size;
+       int fd;
+       __u32 nsid;
+       __u64 slba;
+       enum nvme_zns_send_action zsa;
+       bool select_all;
+       __u8 zsaso;
+       __u32 data_len;
+       void *data;
+       __u32 timeout;
+       __u32 *result;
+};
+
+/**
+ * nvme_zns_mgmt_send() -
+ * @args:      &struct nvme_zns_mgmt_send_args argument structure
  *
  * Return: The nvme command status if a response was received (see
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
-int nvme_zns_mgmt_send(int fd, __u32 nsid, __u64 slba,
-                      enum nvme_zns_send_action zsa, bool select_all, __u8 zsaso,
-                      __u32 data_len, void *data,
-                      __u32 timeout, __u32 *result);
+int nvme_zns_mgmt_send(struct nvme_zns_mgmt_send_args *args);
 
 
 /**
- * nvme_zns_mgmt_recv() -
+ * nvme_zns_mgmt_recv_args - Arguments for the NVMe ZNS Management Receive command
  * @fd:                File descriptor of nvme device
  * @nsid:      Namespace ID
  * @slba:      Starting logical block address
@@ -3975,14 +3990,29 @@ int nvme_zns_mgmt_send(int fd, __u32 nsid, __u64 slba,
  * @data:      Userspace address of the data
  * @timeout:   timeout in ms
  * @result:    The command completion result from CQE dword0
+ */
+struct nvme_zns_mgmt_recv_args {
+       int args_size;
+       int fd;
+       __u32 nsid;
+       __u64 slba;
+       enum nvme_zns_recv_action zra;
+       __u16 zrasf;
+       bool zras_feat;
+       __u32 data_len;
+       void *data;
+       __u32 timeout;
+       __u32 *result;
+};
+
+/**
+ * nvme_zns_mgmt_recv() -
+ * @args:      &struct nvme_zns_mgmt_recv_args argument structure
  *
  * Return: The nvme command status if a response was received (see
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
-int nvme_zns_mgmt_recv(int fd, __u32 nsid, __u64 slba,
-                      enum nvme_zns_recv_action zra, __u16 zrasf,
-                      bool zras_feat, __u32 data_len, void *data,
-                      __u32 timeout, __u32 *result);
+int nvme_zns_mgmt_recv(struct nvme_zns_mgmt_recv_args *args);
 
 /**
  * nvme_zns_report_zones() - Return the list of zones
@@ -4000,11 +4030,29 @@ int nvme_zns_mgmt_recv(int fd, __u32 nsid, __u64 slba,
  * Return: The nvme command status if a response was received (see
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
-int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba,
+static inline int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba,
                          enum nvme_zns_report_options opts,
                          bool extended, bool partial,
                          __u32 data_len, void *data,
-                         __u32 timeout, __u32 *result);
+                         __u32 timeout, __u32 *result)
+{
+       struct nvme_zns_mgmt_recv_args args = {
+               .args_size = sizeof(args),
+               .fd = fd,
+               .nsid = nsid,
+               .slba = slba,
+               .zra = extended ? NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES :
+               NVME_ZNS_ZRA_REPORT_ZONES,
+               .zrasf = opts,
+               .zras_feat = partial,
+               .data_len = data_len,
+               .data = data,
+               .timeout = timeout,
+               .result = result,
+       };
+
+       return nvme_zns_mgmt_recv(&args);
+}
 
 /**
  * nvme_zns_append() - Append data to a zone
index 997765b44bcf8483dc4adc02a14b4aaa837812eb..b65498623010a2af0aa1b887f6d94b2bd3e66789 100644 (file)
@@ -45,11 +45,10 @@ static void show_zns_properties(nvme_ns_t n)
 
        printf("zasl:%u\n", zns_ctrl.zasl);
 
-       if (nvme_zns_mgmt_recv(nvme_ns_get_fd(n), nvme_ns_get_nsid(n), 0,
-                              NVME_ZNS_ZRA_REPORT_ZONES,
-                              NVME_ZNS_ZRAS_REPORT_ALL,
-                              true, 0x1000, (void *)zr,
-                              NVME_DEFAULT_IOCTL_TIMEOUT, &result)) {
+       if (nvme_zns_report_zones(nvme_ns_get_fd(n), nvme_ns_get_nsid(n), 0,
+                                 NVME_ZNS_ZRAS_REPORT_ALL, false,
+                                 true, 0x1000, (void *)zr,
+                                 NVME_DEFAULT_IOCTL_TIMEOUT, &result)) {
                fprintf(stderr, "failed to report zones, result %x\n",
                        le32_to_cpu(result));
                return;