nvmf: split subsystem lookup from host check

This allows us to print better error messages when connecting to a
subsystem that exists but does not allow a specific host.

Additionally, we can now return the correct error code for a host that
is not allowed.

Change-Id: I16cd4ac2745cf50bb54601b464b0d23954f86fda
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2016-11-23 10:32:07 -07:00
parent aa3d7381cc
commit 6ca517d460
7 changed files with 50 additions and 23 deletions

View File

@ -167,9 +167,12 @@ struct spdk_nvmf_subsystem *spdk_nvmf_create_subsystem(const char *nqn,
void spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem);
struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn);
nvmf_find_subsystem(const char *subnqn);
bool spdk_nvmf_subsystem_exists(const char *subnqn);
bool spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn);
int
spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
char *trname, char *traddr, char *trsvcid);

View File

@ -215,14 +215,21 @@ nvmf_process_connect(struct spdk_nvmf_request *req)
INVALID_CONNECT_DATA(hostnqn);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
/* Look up the requested subsystem */
subsystem = nvmf_find_subsystem(data->subnqn, data->hostnqn);
subsystem = nvmf_find_subsystem(data->subnqn);
if (subsystem == NULL) {
SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn);
INVALID_CONNECT_DATA(subnqn);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
if (!spdk_nvmf_subsystem_host_allowed(subsystem, data->hostnqn)) {
SPDK_ERRLOG("Subsystem '%s' does not allow host '%s'\n", data->subnqn, data->hostnqn);
rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
rsp->status.sc = SPDK_NVMF_FABRIC_SC_INVALID_HOST;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
subsystem->connect_cb(subsystem->cb_ctx, req);
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;

View File

@ -217,7 +217,7 @@ spdk_nvmf_session_connect(struct spdk_nvmf_conn *conn,
SPDK_TRACELOG(SPDK_TRACE_NVMF, " subnqn: \"%s\"\n", data->subnqn);
SPDK_TRACELOG(SPDK_TRACE_NVMF, " hostnqn: \"%s\"\n", data->hostnqn);
subsystem = nvmf_find_subsystem(data->subnqn, data->hostnqn);
subsystem = nvmf_find_subsystem(data->subnqn);
if (subsystem == NULL) {
SPDK_ERRLOG("Could not find subsystem '%s'\n", data->subnqn);
INVALID_CONNECT_DATA(subnqn);

View File

@ -66,33 +66,46 @@ spdk_nvmf_subsystem_exists(const char *subnqn)
}
struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn)
nvmf_find_subsystem(const char *subnqn)
{
struct spdk_nvmf_subsystem *subsystem;
struct spdk_nvmf_host *host;
if (!subnqn || !hostnqn) {
if (!subnqn) {
return NULL;
}
TAILQ_FOREACH(subsystem, &g_subsystems, entries) {
if (strcmp(subnqn, subsystem->subnqn) == 0) {
if (subsystem->num_hosts == 0) {
/* No hosts means any host can connect */
return subsystem;
}
TAILQ_FOREACH(host, &subsystem->hosts, link) {
if (strcmp(hostnqn, host->nqn) == 0) {
return subsystem;
}
}
return subsystem;
}
}
return NULL;
}
bool
spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)
{
struct spdk_nvmf_host *host;
if (!hostnqn) {
return false;
}
if (subsystem->num_hosts == 0) {
/* No hosts means any host can connect */
return true;
}
TAILQ_FOREACH(host, &subsystem->hosts, link) {
if (strcmp(hostnqn, host->nqn) == 0) {
return true;
}
}
return false;
}
void
spdk_nvmf_subsystem_poll(struct spdk_nvmf_subsystem *subsystem)
{

View File

@ -124,11 +124,17 @@ spdk_format_discovery_log(struct spdk_nvmf_discovery_log_page *disc_log, uint32_
}
struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn)
nvmf_find_subsystem(const char *subnqn)
{
return NULL;
}
bool
spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)
{
return false;
}
static void
test_nvmf_process_discovery_cmd(void)
{

View File

@ -45,7 +45,7 @@ SPDK_LOG_REGISTER_TRACE_FLAG("nvmf", SPDK_TRACE_NVMF)
struct spdk_nvmf_globals g_nvmf_tgt;
struct spdk_nvmf_subsystem *
nvmf_find_subsystem(const char *subnqn, const char *hostnqn)
nvmf_find_subsystem(const char *subnqn)
{
return NULL;
}

View File

@ -126,10 +126,8 @@ nvmf_test_create_subsystem(void)
static void
nvmf_test_find_subsystem(void)
{
CU_ASSERT_PTR_NULL(nvmf_find_subsystem(NULL, NULL));
CU_ASSERT_PTR_NULL(nvmf_find_subsystem("fake", NULL));
CU_ASSERT_PTR_NULL(nvmf_find_subsystem(NULL, "fake"));
CU_ASSERT_PTR_NULL(nvmf_find_subsystem("fake", "fake"));
CU_ASSERT_PTR_NULL(nvmf_find_subsystem(NULL));
CU_ASSERT_PTR_NULL(nvmf_find_subsystem("fake"));
}
int main(int argc, char **argv)