From 7eb8331d0ffbc4263fa8b6a375f34edde4b442ae Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Fri, 17 Dec 2021 08:03:42 +0100 Subject: [PATCH] Use argument structure for nvme_zns_append() 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. Signed-off-by: Hannes Reinecke --- src/nvme/ioctl.c | 31 +++++++++++++++---------------- src/nvme/ioctl.h | 29 ++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/nvme/ioctl.c b/src/nvme/ioctl.c index 531763c2..ad1fd0ca 100644 --- a/src/nvme/ioctl.c +++ b/src/nvme/ioctl.c @@ -1765,31 +1765,30 @@ int nvme_zns_mgmt_recv(struct nvme_zns_mgmt_recv_args *args) return nvme_submit_io_passthru(args->fd, &cmd, args->result); } -int nvme_zns_append(int fd, __u32 nsid, __u64 zslba, __u16 nlb, __u16 control, - __u32 ilbrt, __u16 lbat, __u16 lbatm, __u32 data_len, - void *data, __u32 metadata_len, void *metadata, - __u32 timeout, __u64 *result) +int nvme_zns_append(struct nvme_zns_append_args *args) { - __u32 cdw10 = zslba & 0xffffffff; - __u32 cdw11 = zslba >> 32; - __u32 cdw12 = nlb | (control << 16); - __u32 cdw14 = ilbrt; - __u32 cdw15 = lbat | (lbatm << 16); + __u32 cdw10 = args->zslba & 0xffffffff; + __u32 cdw11 = args->zslba >> 32; + __u32 cdw12 = args->nlb | (args->control << 16); + __u32 cdw14 = args->ilbrt; + __u32 cdw15 = args->lbat | (args->lbatm << 16); struct nvme_passthru_cmd64 cmd = { .opcode = nvme_zns_cmd_append, - .nsid = nsid, + .nsid = args->nsid, .cdw10 = cdw10, .cdw11 = cdw11, .cdw12 = cdw12, .cdw14 = cdw14, .cdw15 = cdw15, - .metadata = (__u64)(uintptr_t)metadata, - .addr = (__u64)(uintptr_t)data, - .metadata_len = metadata_len, - .data_len = data_len, - .timeout_ms = timeout, + .data_len = args->data_len, + .addr = (__u64)(uintptr_t)args->data, + .metadata_len = args->metadata_len, + .metadata = (__u64)(uintptr_t)args->metadata, + .timeout_ms = args->timeout, }; - return nvme_submit_io_passthru64(fd, &cmd, result); + if (args->args_size < sizeof(*args)) + return -EINVAL; + return nvme_submit_io_passthru64(args->fd, &cmd, args->result); } diff --git a/src/nvme/ioctl.h b/src/nvme/ioctl.h index 42604ca9..b8b479df 100644 --- a/src/nvme/ioctl.h +++ b/src/nvme/ioctl.h @@ -4055,7 +4055,7 @@ static inline int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba, } /** - * nvme_zns_append() - Append data to a zone + * nvme_zns_append_args - Arguments for the NVMe ZNS Append command * @fd: File descriptor of nvme device * @nsid: Namespace ID * @zslba: Zone start logical block address @@ -4070,13 +4070,32 @@ static inline int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba, * @metadata: Userspace address of the metadata * @timeout: Timeout in ms * @result: The command completion result from CQE dword0 + */ +struct nvme_zns_append_args { + int args_size; + int fd; + __u32 nsid; + __u64 zslba; + __u16 nlb; + __u16 control; + __u32 ilbrt; + __u16 lbat; + __u16 lbatm; + __u32 data_len; + void *data; + __u32 metadata_len; + void *metadata; + __u32 timeout; + __u64 *result; +}; + +/** + * nvme_zns_append() - Append data to a zone + * @args: &struct nvme_zns_append_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_append(int fd, __u32 nsid, __u64 zslba, __u16 nlb, __u16 control, - __u32 ilbrt, __u16 lbat, __u16 lbatm, __u32 data_len, - void *data, __u32 metadata_len, void *metadata, - __u32 timeout, __u64 *result); +int nvme_zns_append(struct nvme_zns_append_args *args); #endif /* _LIBNVME_IOCTL_H */ -- 2.50.1