Skip to content

Commit 4571032

Browse files
hreineckedwsuse
authored andcommitted
Use argument structure for nvme_copy()
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 <[email protected]>
1 parent b171dce commit 4571032

2 files changed

Lines changed: 45 additions & 24 deletions

File tree

src/nvme/ioctl.c

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,31 +1603,30 @@ int nvme_dsm(struct nvme_dsm_args *args)
16031603
return nvme_submit_io_passthru(args->fd, &cmd, args->result);
16041604
}
16051605

1606-
int nvme_copy(int fd, __u32 nsid, struct nvme_copy_range *copy, __u64 sdlba,
1607-
__u16 nr, __u8 prinfor, __u8 prinfow, __u8 dtype, __u16 dspec,
1608-
__u8 format, int lr, int fua, __u32 ilbrt, __u16 lbatm,
1609-
__u16 lbat, __u32 timeout, __u32 *result)
1606+
int nvme_copy(struct nvme_copy_args *args)
16101607
{
1611-
__u32 cdw12 = ((nr - 1) & 0xff) | ((format & 0xf) << 8) |
1612-
((prinfor & 0xf) << 12) | ((dtype & 0xf) << 20) |
1613-
((prinfow & 0xf) << 26) | ((fua & 0x1) << 30) |
1614-
((lr & 0x1) << 31);
1608+
__u32 cdw12 = ((args->nr - 1) & 0xff) | ((args->format & 0xf) << 8) |
1609+
((args->prinfor & 0xf) << 12) | ((args->dtype & 0xf) << 20) |
1610+
((args->prinfow & 0xf) << 26) | ((args->fua & 0x1) << 30) |
1611+
((args->lr & 0x1) << 31);
16151612

16161613
struct nvme_passthru_cmd cmd = {
16171614
.opcode = nvme_cmd_copy,
1618-
.nsid = nsid,
1619-
.addr = (__u64)(uintptr_t)copy,
1620-
.data_len = nr * sizeof(*copy),
1621-
.cdw10 = sdlba & 0xffffffff,
1622-
.cdw11 = sdlba >> 32,
1615+
.nsid = args->nsid,
1616+
.addr = (__u64)(uintptr_t)args->copy,
1617+
.data_len = args->nr * sizeof(*args->copy),
1618+
.cdw10 = args->sdlba & 0xffffffff,
1619+
.cdw11 = args->sdlba >> 32,
16231620
.cdw12 = cdw12,
1624-
.cdw13 = (dspec & 0xffff) << 16,
1625-
.cdw14 = ilbrt,
1626-
.cdw15 = (lbatm << 16) | lbat,
1627-
.timeout_ms = timeout,
1621+
.cdw13 = (args->dspec & 0xffff) << 16,
1622+
.cdw14 = args->ilbrt,
1623+
.cdw15 = (args->lbatm << 16) | args->lbat,
1624+
.timeout_ms = args->timeout,
16281625
};
16291626

1630-
return nvme_submit_io_passthru(fd, &cmd, result);
1627+
if (args->args_size < sizeof(*args))
1628+
return -EINVAL;
1629+
return nvme_submit_io_passthru(args->fd, &cmd, args->result);
16311630
}
16321631

16331632
int nvme_resv_acquire(int fd, __u32 nsid, enum nvme_resv_rtype rtype,

src/nvme/ioctl.h

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3748,8 +3748,7 @@ struct nvme_dsm_args {
37483748
int nvme_dsm(struct nvme_dsm_args *args);
37493749

37503750
/**
3751-
* nvme_copy() -
3752-
*
3751+
* nvme_copy_args - Arguments for the NVMe Copy command
37533752
* @fd: File descriptor of the nvme device
37543753
* @nsid: Namespace identifier
37553754
* @copy: Range descriptior
@@ -3767,14 +3766,37 @@ int nvme_dsm(struct nvme_dsm_args *args);
37673766
* @lbat: Logical block application tag
37683767
* @timeout: Timeout in ms
37693768
* @result: The command completion result from CQE dword0
3769+
*/
3770+
struct nvme_copy_args {
3771+
int args_size;
3772+
int fd;
3773+
__u32 nsid;
3774+
struct nvme_copy_range *copy;
3775+
__u64 sdlba;
3776+
__u16 nr;
3777+
__u8 prinfor;
3778+
__u8 prinfow;
3779+
__u8 dtype;
3780+
__u16 dspec;
3781+
__u8 format;
3782+
int lr;
3783+
int fua;
3784+
__u32 ilbrt;
3785+
__u16 lbatm;
3786+
__u16 lbat;
3787+
__u32 timeout;
3788+
__u32 *result;
3789+
};
3790+
3791+
/**
3792+
* nvme_copy() -
3793+
*
3794+
* @args: &struct nvme_copy_args argument structure
37703795
*
37713796
* Return: The nvme command status if a response was received (see
37723797
* &enum nvme_status_field) or -1 with errno set otherwise.
37733798
*/
3774-
int nvme_copy(int fd, __u32 nsid, struct nvme_copy_range *copy, __u64 sdlba,
3775-
__u16 nr, __u8 prinfor, __u8 prinfow, __u8 dtype, __u16 dspec,
3776-
__u8 format, int lr, int fua, __u32 ilbrt, __u16 lbatm,
3777-
__u16 lbat, __u32 timeout, __u32 *result);
3799+
int nvme_copy(struct nvme_copy_args *args);
37783800

37793801
/**
37803802
* nvme_resv_acquire() - Send an nvme reservation acquire

0 commit comments

Comments
 (0)