iscsi: Move acceptor into portal_grp

It's 3 functions that are only called from this compilation
unit.

Change-Id: I033ced4c19ee2a33b9537c347532ea5706d02d6a
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/454493
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2019-05-13 15:12:32 -07:00 committed by Jim Harris
parent 31736dc25c
commit 3f81bcaf12
9 changed files with 77 additions and 161 deletions

View File

@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
CFLAGS += -I$(SPDK_ROOT_DIR)/lib
C_SRCS = acceptor.c conn.c \
C_SRCS = conn.c \
init_grp.c iscsi.c md5.c param.c portal_grp.c \
tgt_node.c iscsi_subsystem.c \
iscsi_rpc.c task.c

View File

@ -1,91 +0,0 @@
/*-
* BSD LICENSE
*
* Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
* Copyright (c) Intel Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "spdk/stdinc.h"
#include "spdk/env.h"
#include "spdk/thread.h"
#include "spdk/log.h"
#include "spdk/sock.h"
#include "spdk/string.h"
#include "iscsi/acceptor.h"
#include "iscsi/conn.h"
#include "iscsi/portal_grp.h"
#define ACCEPT_TIMEOUT_US 1000 /* 1ms */
static int
iscsi_portal_accept(void *arg)
{
struct spdk_iscsi_portal *portal = arg;
struct spdk_sock *sock;
int rc;
int count = 0;
if (portal->sock == NULL) {
return -1;
}
while (1) {
sock = spdk_sock_accept(portal->sock);
if (sock != NULL) {
rc = spdk_iscsi_conn_construct(portal, sock);
if (rc < 0) {
spdk_sock_close(&sock);
SPDK_ERRLOG("spdk_iscsi_connection_construct() failed\n");
break;
}
count++;
} else {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
SPDK_ERRLOG("accept error(%d): %s\n", errno, spdk_strerror(errno));
}
break;
}
}
return count;
}
void
spdk_iscsi_acceptor_start(struct spdk_iscsi_portal *p)
{
p->acceptor_poller = spdk_poller_register(iscsi_portal_accept, p, ACCEPT_TIMEOUT_US);
}
void
spdk_iscsi_acceptor_stop(struct spdk_iscsi_portal *p)
{
spdk_poller_unregister(&p->acceptor_poller);
}

View File

@ -1,43 +0,0 @@
/*-
* BSD LICENSE
*
* Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
* Copyright (c) Intel Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef SPDK_ACCEPTOR_H_
#define SPDK_ACCEPTOR_H_
struct spdk_iscsi_portal;
void spdk_iscsi_acceptor_start(struct spdk_iscsi_portal *p);
void spdk_iscsi_acceptor_stop(struct spdk_iscsi_portal *p);
#endif /* SPDK_ACCEPTOR_H_ */

View File

@ -53,7 +53,6 @@
#include "spdk/scsi.h"
#include "spdk/bdev.h"
#include "iscsi/portal_grp.h"
#include "iscsi/acceptor.h"
#include "spdk_internal/log.h"

View File

@ -44,9 +44,54 @@
#include "iscsi/iscsi.h"
#include "iscsi/conn.h"
#include "iscsi/portal_grp.h"
#include "iscsi/acceptor.h"
#define PORTNUMSTRLEN 32
#define ACCEPT_TIMEOUT_US 1000 /* 1ms */
static int
iscsi_portal_accept(void *arg)
{
struct spdk_iscsi_portal *portal = arg;
struct spdk_sock *sock;
int rc;
int count = 0;
if (portal->sock == NULL) {
return -1;
}
while (1) {
sock = spdk_sock_accept(portal->sock);
if (sock != NULL) {
rc = spdk_iscsi_conn_construct(portal, sock);
if (rc < 0) {
spdk_sock_close(&sock);
SPDK_ERRLOG("spdk_iscsi_connection_construct() failed\n");
break;
}
count++;
} else {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
SPDK_ERRLOG("accept error(%d): %s\n", errno, spdk_strerror(errno));
}
break;
}
}
return count;
}
static void
iscsi_acceptor_start(struct spdk_iscsi_portal *p)
{
p->acceptor_poller = spdk_poller_register(iscsi_portal_accept, p, ACCEPT_TIMEOUT_US);
}
static void
iscsi_acceptor_stop(struct spdk_iscsi_portal *p)
{
spdk_poller_unregister(&p->acceptor_poller);
}
static struct spdk_iscsi_portal *
iscsi_portal_find_by_addr(const char *host, const char *port)
@ -200,7 +245,7 @@ iscsi_portal_open(struct spdk_iscsi_portal *p)
* the requests will be queued by the nonzero backlog of the socket
* or resend by TCP.
*/
spdk_iscsi_acceptor_start(p);
iscsi_acceptor_start(p);
return 0;
}
@ -211,7 +256,7 @@ iscsi_portal_close(struct spdk_iscsi_portal *p)
if (p->sock) {
SPDK_DEBUGLOG(SPDK_LOG_ISCSI, "close portal (%s, %s)\n",
p->host, p->port);
spdk_iscsi_acceptor_stop(p);
iscsi_acceptor_stop(p);
spdk_sock_close(&p->sock);
}
}

View File

@ -80,4 +80,5 @@ void spdk_iscsi_portal_grp_close_all(void);
void spdk_iscsi_portal_grps_config_text(FILE *fp);
void spdk_iscsi_portal_grps_info_json(struct spdk_json_write_ctx *w);
void spdk_iscsi_portal_grps_config_json(struct spdk_json_write_ctx *w);
#endif /* SPDK_PORTAL_GRP_H */

View File

@ -1,7 +1,6 @@
#include "iscsi/task.h"
#include "iscsi/iscsi.h"
#include "iscsi/conn.h"
#include "iscsi/acceptor.h"
#include "spdk/env.h"
#include "spdk/event.h"
@ -98,26 +97,6 @@ spdk_scsi_dev_get_name(const struct spdk_scsi_dev *dev)
return NULL;
}
DEFINE_STUB_V(spdk_iscsi_acceptor_start, (struct spdk_iscsi_portal *p));
DEFINE_STUB_V(spdk_iscsi_acceptor_stop, (struct spdk_iscsi_portal *p));
struct spdk_sock *
spdk_sock_listen(const char *ip, int port)
{
static int g_sock;
return (struct spdk_sock *)&g_sock;
}
int
spdk_sock_close(struct spdk_sock **sock)
{
*sock = NULL;
return 0;
}
static struct spdk_cpuset *g_app_core_mask;
struct spdk_cpuset *

View File

@ -42,7 +42,6 @@
#include "iscsi/iscsi.c"
#include "../common.c"
#include "iscsi/acceptor.h"
#include "iscsi/portal_grp.h"
#include "scsi/scsi_internal.h"
#include "common/lib/test_env.c"

View File

@ -36,10 +36,19 @@
#include "spdk_cunit.h"
#include "common/lib/test_env.c"
#include "common/lib/test_sock.c"
#include "../common.c"
#include "iscsi/portal_grp.c"
#include "unit/lib/json_mock.c"
#include "spdk_internal/thread.h"
DEFINE_STUB(spdk_iscsi_conn_construct, int,
(struct spdk_iscsi_portal *portal, struct spdk_sock *sock),
0);
struct spdk_iscsi_globals g_spdk_iscsi;
static int
@ -381,10 +390,15 @@ portal_grp_register_twice_case(void)
static void
portal_grp_add_delete_case(void)
{
struct spdk_sock sock = {};
struct spdk_thread *thread;
struct spdk_iscsi_portal_grp *pg1, *pg2;
struct spdk_iscsi_portal *p;
int rc;
thread = spdk_thread_create(NULL, NULL);
spdk_set_thread(thread);
const char *host = "192.168.2.0";
const char *port = "3260";
const char *cpumask = "1";
@ -398,8 +412,10 @@ portal_grp_add_delete_case(void)
spdk_iscsi_portal_grp_add_portal(pg1, p);
MOCK_SET(spdk_sock_listen, &sock);
rc = spdk_iscsi_portal_grp_open(pg1);
CU_ASSERT(rc == 0);
MOCK_CLEAR_P(spdk_sock_listen);
rc = spdk_iscsi_portal_grp_register(pg1);
CU_ASSERT(rc == 0);
@ -413,11 +429,15 @@ portal_grp_add_delete_case(void)
CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head));
spdk_thread_exit(thread);
}
static void
portal_grp_add_delete_twice_case(void)
{
struct spdk_sock sock = {};
struct spdk_thread *thread;
struct spdk_iscsi_portal_grp *pg1, *pg2;
struct spdk_iscsi_portal *p;
int rc;
@ -426,6 +446,9 @@ portal_grp_add_delete_twice_case(void)
const char *port1 = "3260", *port2 = "3261";
const char *cpumask = "1";
thread = spdk_thread_create(NULL, NULL);
spdk_set_thread(thread);
/* internal of add_portal_group related */
pg1 = spdk_iscsi_portal_grp_create(1);
CU_ASSERT(pg1 != NULL);
@ -435,6 +458,7 @@ portal_grp_add_delete_twice_case(void)
spdk_iscsi_portal_grp_add_portal(pg1, p);
MOCK_SET(spdk_sock_listen, &sock);
rc = spdk_iscsi_portal_grp_open(pg1);
CU_ASSERT(rc == 0);
@ -464,6 +488,9 @@ portal_grp_add_delete_twice_case(void)
CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head));
MOCK_CLEAR_P(spdk_sock_listen);
spdk_thread_exit(thread);
}
int