Skip to content

Commit 4de6315

Browse files
authored
Merge pull request #234 from jeffreyalien/uuidx-parm
[libnvme] Add uuidx parm to get log page API
2 parents 537bef9 + c23dbd4 commit 4de6315

4 files changed

Lines changed: 67 additions & 64 deletions

File tree

src/libnvme.map

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ LIBNVME_1_0 {
123123
nvme_get_log_fw_slot;
124124
nvme_get_log_lba_status;
125125
nvme_get_log_page;
126-
nvme_get_log_page_padded;
127126
nvme_get_log_persistent_event;
128127
nvme_get_log_predictable_lat_event;
129128
nvme_get_log_predictable_lat_nvmset;

src/nvme/fabrics.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -670,8 +670,24 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
670670

671671
static int nvme_discovery_log(int fd, __u32 len, struct nvmf_discovery_log *log, bool rae)
672672
{
673-
return nvme_get_log_page(fd, 0, NVME_LOG_LID_DISCOVER, rae, 512,
674-
len, log);
673+
struct nvme_get_log_args args = {
674+
.args_size = sizeof(args),
675+
.fd = fd,
676+
.nsid = NVME_NSID_NONE,
677+
.lsp = NVME_LOG_LSP_NONE,
678+
.lsi = NVME_LOG_LSI_NONE,
679+
.uuidx = NVME_UUID_NONE,
680+
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
681+
.result = NULL,
682+
.lid = NVME_LOG_LID_DISCOVER,
683+
.log = log,
684+
.len = len,
685+
.csi = NVME_CSI_NVM,
686+
.rae = rae,
687+
.ot = false,
688+
};
689+
690+
return nvme_get_log_page(fd, 4096, &args);
675691
}
676692

677693
int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,

src/nvme/linux.c

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -116,33 +116,19 @@ int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset,
116116
return err;
117117
}
118118

119-
int nvme_get_log_page(int fd, __u32 nsid, __u8 log_id, bool rae,
120-
__u32 xfer_len, __u32 data_len, void *data)
119+
int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args)
121120
{
122121
__u64 offset = 0, xfer;
123122
bool retain = true;
124-
void *ptr = data;
123+
void *ptr = args->log;
125124
int ret;
126-
struct nvme_get_log_args args = {
127-
.args_size = sizeof(args),
128-
.fd = fd,
129-
.nsid = nsid,
130-
.lid = log_id,
131-
.lsp = NVME_LOG_LSP_NONE,
132-
.lsi = NVME_LOG_LSI_NONE,
133-
.uuidx = NVME_UUID_NONE,
134-
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
135-
.result = NULL,
136-
.csi = NVME_CSI_NVM,
137-
.ot = false,
138-
};
139125

140126
/*
141127
* 4k is the smallest possible transfer unit, so restricting to 4k
142128
* avoids having to check the MDTS value of the controller.
143129
*/
144130
do {
145-
xfer = data_len - offset;
131+
xfer = args->len - offset;
146132
if (xfer > xfer_len)
147133
xfer = xfer_len;
148134

@@ -151,30 +137,24 @@ int nvme_get_log_page(int fd, __u32 nsid, __u8 log_id, bool rae,
151137
* last portion of this log page so the data remains latched
152138
* during the fetch sequence.
153139
*/
154-
if (offset + xfer == data_len)
155-
retain = rae;
156-
157-
args.lpo = offset;
158-
args.len = xfer;
159-
args.log = ptr;
160-
args.rae = retain;
161-
ret = nvme_get_log(&args);
140+
if (offset + xfer == args->len)
141+
retain = args->rae;
142+
143+
args->lpo = offset;
144+
args->len = xfer;
145+
args->log = ptr;
146+
args->rae = retain;
147+
ret = nvme_get_log(args);
162148
if (ret)
163149
return ret;
164150

165151
offset += xfer;
166152
ptr += xfer;
167-
} while (offset < data_len);
153+
} while (offset < args->len);
168154

169155
return 0;
170156
}
171157

172-
int nvme_get_log_page_padded(int fd, __u32 nsid, __u8 log_id, bool rae,
173-
__u32 data_len, void *data)
174-
{
175-
return nvme_get_log_page(fd, nsid, log_id, rae, 4096, data_len, data);
176-
}
177-
178158
static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
179159
struct nvme_telemetry_log **buf, enum nvme_telemetry_da da,
180160
size_t *size)
@@ -186,6 +166,19 @@ static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
186166
struct nvme_id_ctrl id_ctrl;
187167
void *log, *tmp;
188168
int err;
169+
struct nvme_get_log_args args = {
170+
.args_size = sizeof(args),
171+
.fd = fd,
172+
.nsid = NVME_NSID_NONE,
173+
.lsp = NVME_LOG_LSP_NONE,
174+
.lsi = NVME_LOG_LSI_NONE,
175+
.uuidx = NVME_UUID_NONE,
176+
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
177+
.result = NULL,
178+
.csi = NVME_CSI_NVM,
179+
.rae = rae,
180+
.ot = false,
181+
};
189182

190183
*size = 0;
191184

@@ -254,8 +247,10 @@ static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
254247
}
255248
log = tmp;
256249

257-
err = nvme_get_log_page_padded(fd, NVME_NSID_NONE, lid, rae, (__u32)*size,
258-
(void *)log);
250+
args.lid = lid;
251+
args.log = log;
252+
args.len = *size;
253+
err = nvme_get_log_page(fd, 4096, &args);
259254
if (!err) {
260255
*buf = log;
261256
return 0;
@@ -288,6 +283,19 @@ int nvme_get_lba_status_log(int fd, bool rae, struct nvme_lba_status_log **log)
288283
__u32 size = sizeof(struct nvme_lba_status_log);
289284
void *buf, *tmp;
290285
int err;
286+
struct nvme_get_log_args args = {
287+
.args_size = sizeof(args),
288+
.fd = fd,
289+
.nsid = NVME_NSID_NONE,
290+
.lsp = NVME_LOG_LSP_NONE,
291+
.lsi = NVME_LOG_LSI_NONE,
292+
.uuidx = NVME_UUID_NONE,
293+
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
294+
.result = NULL,
295+
.csi = NVME_CSI_NVM,
296+
.rae = rae,
297+
.ot = false,
298+
};
291299

292300
buf = malloc(size);
293301
if (!buf)
@@ -310,8 +318,10 @@ int nvme_get_lba_status_log(int fd, bool rae, struct nvme_lba_status_log **log)
310318
buf = tmp;
311319
*log = buf;
312320

313-
err = nvme_get_log_page_padded(fd, NVME_NSID_NONE, NVME_LOG_LID_LBA_STATUS,
314-
rae, size, buf);
321+
args.lid = NVME_LOG_LID_LBA_STATUS;
322+
args.log = buf;
323+
args.len = size;
324+
err = nvme_get_log_page(fd, 4096, &args);
315325
if (!err)
316326
return 0;
317327

src/nvme/linux.h

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <stddef.h>
1313

14+
#include "ioctl.h"
1415
#include "types.h"
1516

1617
/**
@@ -99,36 +100,13 @@ int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log,
99100
/**
100101
* nvme_get_log_page() - get log page data
101102
* @fd: File descriptor of nvme device
102-
* @nsid: Namespace Identifier, if applicable.
103-
* @log_id: Log Identifier, see &enum nvme_cmd_get_log_lid.
104-
* @rae: Retain asynchronous events
105103
* @xfer_len: Max log transfer size per request to split the total.
106-
* @data_len: Total length of the log to transfer.
107-
* @data: User address of at least &data_len to store the log.
104+
* @args: &struct nvme_get_log_args argument structure
108105
*
109106
* Return: The nvme command status if a response was received (see
110107
* &enum nvme_status_field) or -1 with errno set otherwise.
111108
*/
112-
int nvme_get_log_page(int fd, __u32 nsid, __u8 log_id, bool rae,
113-
__u32 xfer_len, __u32 data_len, void *data);
114-
115-
/**
116-
* nvme_get_log_page_padded() - get log page data with 4k xfer length
117-
* @fd: File descriptor of nvme device
118-
* @nsid: Namespace Identifier, if applicable.
119-
* @log_id: Log Identifier, see &enum nvme_cmd_get_log_lid.
120-
* @rae: Retain asynchronous events
121-
* @data_len: Total length of the log to transfer.
122-
* @data: User address of at least &data_len to store the log.
123-
*
124-
* Calls nvme_get_log_page() with a default 4k transfer length, as that is
125-
* guaranteed by the protocol to be a safe transfer size.
126-
*
127-
* Return: The nvme command status if a response was received (see
128-
* &enum nvme_status_field) or -1 with errno set otherwise.
129-
*/
130-
int nvme_get_log_page_padded(int fd, __u32 nsid, __u8 log_id, bool rae,
131-
__u32 data_len, void *data);
109+
int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args);
132110

133111
/**
134112
* nvme_get_ana_log_len() - Retreive size of the current ANA log

0 commit comments

Comments
 (0)