Skip to content

Commit 0aa14e5

Browse files
authored
Merge pull request #483 from martin-belanger/add-pleo-support
fabrics: Add nvmf_get_discovery_wargs()
2 parents 677075a + ceb1aa3 commit 0aa14e5

3 files changed

Lines changed: 108 additions & 35 deletions

File tree

src/libnvme.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ LIBNVME_1_2 {
44
global:
55
nvme_ctrl_get_dhchap_host_key;
66
nvme_ctrl_set_dhchap_host_key;
7+
nvmf_get_discovery_wargs;
78
};
89

910
LIBNVME_1_1 {

src/nvme/fabrics.c

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -780,37 +780,19 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
780780
return NULL;
781781
}
782782

783-
static int nvme_discovery_log(int fd, __u32 len, struct nvmf_discovery_log *log, bool rae)
784-
{
785-
struct nvme_get_log_args args = {
786-
.args_size = sizeof(args),
787-
.fd = fd,
788-
.nsid = NVME_NSID_NONE,
789-
.lsp = NVME_LOG_LSP_NONE,
790-
.lsi = NVME_LOG_LSI_NONE,
791-
.uuidx = NVME_UUID_NONE,
792-
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
793-
.result = NULL,
794-
.lid = NVME_LOG_LID_DISCOVER,
795-
.log = log,
796-
.len = len,
797-
.csi = NVME_CSI_NVM,
798-
.rae = rae,
799-
.ot = false,
800-
};
801-
802-
return nvme_get_log_page(fd, 4096, &args);
803-
}
804-
805-
int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
806-
int max_retries)
783+
static struct nvmf_discovery_log *nvme_discovery_log(nvme_ctrl_t c,
784+
struct nvme_get_log_args *args,
785+
int max_retries)
807786
{
808787
nvme_root_t r = c->s && c->s->h ? c->s->h->r : NULL;
809788
struct nvmf_discovery_log *log = NULL;
810789
int ret, retries = 0;
811790
const char *name = nvme_ctrl_get_name(c);
812791
uint64_t genctr, numrec;
813792
unsigned int size;
793+
int fd = nvme_ctrl_get_fd(c);
794+
795+
args->fd = fd;
814796

815797
do {
816798
size = sizeof(struct nvmf_discovery_log);
@@ -821,12 +803,15 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
821803
nvme_msg(r, LOG_ERR,
822804
"could not allocate memory for discovery log header\n");
823805
errno = ENOMEM;
824-
return -1;
806+
return NULL;
825807
}
826808

827809
nvme_msg(r, LOG_DEBUG, "%s: get header (try %d/%d)\n",
828810
name, retries, max_retries);
829-
ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log, true);
811+
args->rae = true;
812+
args->len = size;
813+
args->log = log;
814+
ret = nvme_get_log_page(fd, 4096, args);
830815
if (ret) {
831816
nvme_msg(r, LOG_INFO,
832817
"%s: discover try %d/%d failed, error %d\n",
@@ -849,14 +834,19 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
849834
nvme_msg(r, LOG_ERR,
850835
"could not alloc memory for discovery log page\n");
851836
errno = ENOMEM;
852-
return -1;
837+
return NULL;
853838
}
854839

855840
nvme_msg(r, LOG_DEBUG,
856841
"%s: get header and %" PRIu64
857842
" records (length %d genctr %" PRIu64 ")\n",
858843
name, numrec, size, genctr);
859-
ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log, false);
844+
845+
args->rae = false;
846+
args->len = size;
847+
args->log = log;
848+
ret = nvme_get_log_page(fd, 4096, args);
849+
860850
if (ret) {
861851
nvme_msg(r, LOG_INFO,
862852
"%s: discover try %d/%d failed, error %d\n",
@@ -869,21 +859,63 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
869859
if (genctr != le64_to_cpu(log->genctr)) {
870860
nvme_msg(r, LOG_INFO, "%s: discover genctr mismatch\n", name);
871861
errno = EAGAIN;
872-
ret = -1;
873862
} else if (numrec != le64_to_cpu(log->numrec)) {
874863
nvme_msg(r, LOG_INFO,
875864
"%s: could only fetch %" PRIu64 " of %" PRIu64 " records\n",
876865
name, numrec, le64_to_cpu(log->numrec));
877866
errno = EBADSLT;
878-
ret = -1;
879867
} else {
880-
*logp = log;
881-
return 0;
868+
return log;
882869
}
883870

884871
out_free_log:
885872
free(log);
886-
return ret;
873+
return NULL;
874+
}
875+
876+
int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
877+
int max_retries)
878+
{
879+
struct nvme_get_log_args args = {
880+
.args_size = sizeof(args),
881+
.fd = nvme_ctrl_get_fd(c),
882+
.nsid = NVME_NSID_NONE,
883+
.lsp = NVMF_LOG_DISC_LSP_NONE,
884+
.lsi = NVME_LOG_LSI_NONE,
885+
.uuidx = NVME_UUID_NONE,
886+
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
887+
.result = NULL,
888+
.lid = NVME_LOG_LID_DISCOVER,
889+
.log = NULL,
890+
.len = 0,
891+
.csi = NVME_CSI_NVM,
892+
.rae = false,
893+
.ot = false,
894+
};
895+
*logp = nvme_discovery_log(c, &args, max_retries);
896+
return logp ? 0 : -1;
897+
}
898+
899+
struct nvmf_discovery_log *nvmf_get_discovery_wargs(struct nvme_get_discovery_args *args)
900+
{
901+
struct nvme_get_log_args _args = {
902+
.args_size = sizeof(_args),
903+
.fd = nvme_ctrl_get_fd(args->c),
904+
.nsid = NVME_NSID_NONE,
905+
.lsp = args->lsp,
906+
.lsi = NVME_LOG_LSI_NONE,
907+
.uuidx = NVME_UUID_NONE,
908+
.timeout = args->timeout,
909+
.result = args->result,
910+
.lid = NVME_LOG_LID_DISCOVER,
911+
.log = NULL,
912+
.len = 0,
913+
.csi = NVME_CSI_NVM,
914+
.rae = false,
915+
.ot = false,
916+
};
917+
918+
return nvme_discovery_log(args->c, &_args, args->max_retries);
887919
}
888920

889921
#define PATH_UUID_IBM "/proc/device-tree/ibm,partition-uuid"

src/nvme/fabrics.h

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,15 +195,55 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
195195

196196
/**
197197
* nvmf_get_discovery_log() - Return the discovery log page
198-
* @c: Discover controller to use
198+
* @c: Discovery controller to use
199199
* @logp: Pointer to the log page to be returned
200-
* @max_retries: maximum number of log page entries to be returned
200+
* @max_retries: Number of retries in case of failure
201+
*
202+
* The memory allocated for the log page and returned in @logp
203+
* must be freed by the caller using free().
204+
*
205+
* Note: Consider using nvmf_get_discovery_wargs() instead.
201206
*
202207
* Return: 0 on success; on failure -1 is returned and errno is set
203208
*/
204209
int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
205210
int max_retries);
206211

212+
/**
213+
* struct nvme_get_discovery_args - Arguments for nvmf_get_discovery_wargs()
214+
* @c: Discovery controller
215+
* @args_size: Length of the structure
216+
* @max_retries: Number of retries in case of failure
217+
* @result: The command completion result from CQE dword0
218+
* @timeout: Timeout in ms (default: NVME_DEFAULT_IOCTL_TIMEOUT)
219+
* @lsp: Log specific field (See enum nvmf_log_discovery_lsp)
220+
*/
221+
struct nvme_get_discovery_args {
222+
nvme_ctrl_t c;
223+
int args_size;
224+
int max_retries;
225+
__u32 *result;
226+
__u32 timeout;
227+
__u8 lsp;
228+
};
229+
230+
/**
231+
* nvmf_get_discovery_wargs() - Get the discovery log page with args
232+
* @args: Argument structure
233+
*
234+
* This function is similar to nvmf_get_discovery_log(), but
235+
* takes an extensible @args parameter. @args provides more
236+
* options than nvmf_get_discovery_log().
237+
*
238+
* This function performs a get discovery log page (DLP) command
239+
* and returns the DLP. The memory allocated for the returned
240+
* DLP must be freed by the caller using free().
241+
*
242+
* Return: Pointer to the discovery log page (to be freed). NULL
243+
* on failure and errno is set.
244+
*/
245+
struct nvmf_discovery_log *nvmf_get_discovery_wargs(struct nvme_get_discovery_args *args);
246+
207247
/**
208248
* nvmf_hostnqn_generate() - Generate a machine specific host nqn
209249
* Returns: An nvm namespace qualified name string based on the machine

0 commit comments

Comments
 (0)