mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-22 13:11:27 +00:00
isert-scst: Introduce the function isert_setup_id()
Introduce the function isert_setup_id(). This function creates and sets up an RDMA CM ID. Move the isert_portal_listen() call into isert_portal_create(). Signed-off-by: Chesnokov Gleb <Chesnokov.G@raidix.com> [ bvanassche: edited patch description and dropped support for older kernel versions in the PRINT_INFO() statement ] git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9481 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -289,7 +289,7 @@ extern struct kmem_cache *isert_cmnd_cache;
|
|||||||
extern struct kmem_cache *isert_conn_cache;
|
extern struct kmem_cache *isert_conn_cache;
|
||||||
|
|
||||||
/* iser portal */
|
/* iser portal */
|
||||||
struct isert_portal *isert_portal_create(void);
|
struct isert_portal *isert_portal_create(struct sockaddr *sa, size_t addr_len);
|
||||||
int isert_portal_listen(struct isert_portal *portal,
|
int isert_portal_listen(struct isert_portal *portal,
|
||||||
struct sockaddr *sa,
|
struct sockaddr *sa,
|
||||||
size_t addr_len);
|
size_t addr_len);
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
static DEFINE_MUTEX(dev_list_mutex);
|
static DEFINE_MUTEX(dev_list_mutex);
|
||||||
|
|
||||||
static void isert_portal_free(struct isert_portal *portal);
|
static void isert_portal_free(struct isert_portal *portal);
|
||||||
|
static struct rdma_cm_id *
|
||||||
|
isert_setup_id(struct isert_portal *portal);
|
||||||
|
|
||||||
static int isert_num_recv_posted_on_err(struct ib_recv_wr *first_ib_wr,
|
static int isert_num_recv_posted_on_err(struct ib_recv_wr *first_ib_wr,
|
||||||
BAD_WR_MODIFIER struct ib_recv_wr *bad_wr)
|
BAD_WR_MODIFIER struct ib_recv_wr *bad_wr)
|
||||||
@@ -1781,10 +1783,69 @@ out:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct rdma_cm_id *
|
||||||
|
isert_setup_id(struct isert_portal *portal)
|
||||||
|
{
|
||||||
|
struct rdma_cm_id *id;
|
||||||
|
struct sockaddr *sa;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
sa = (struct sockaddr *)&portal->addr;
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0) && \
|
||||||
|
(!defined(RHEL_MAJOR) || RHEL_MAJOR -0 <= 5)
|
||||||
|
id = rdma_create_id(isert_cm_evt_handler, portal, RDMA_PS_TCP);
|
||||||
|
#elif !RDMA_CREATE_ID_TAKES_NET_ARG
|
||||||
|
id = rdma_create_id(isert_cm_evt_handler, portal, RDMA_PS_TCP,
|
||||||
|
IB_QPT_RC);
|
||||||
|
#else
|
||||||
|
id = rdma_create_id(iscsi_net_ns, isert_cm_evt_handler, portal,
|
||||||
|
RDMA_PS_TCP, IB_QPT_RC);
|
||||||
|
#endif
|
||||||
|
if (IS_ERR(id)) {
|
||||||
|
ret = PTR_ERR(id);
|
||||||
|
PRINT_ERROR("Failed to create rdma id, err:%d", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
|
||||||
|
/*
|
||||||
|
* Allow both IPv4 and IPv6 sockets to bind a single port
|
||||||
|
* at the same time.
|
||||||
|
*/
|
||||||
|
ret = rdma_set_afonly(id, 1);
|
||||||
|
if (ret) {
|
||||||
|
PRINT_ERROR("Failed to set afonly, err:%d", ret);
|
||||||
|
goto out_id;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ret = rdma_bind_addr(id, sa);
|
||||||
|
if (ret) {
|
||||||
|
PRINT_ERROR("Failed to bind rdma addr, err:%d", ret);
|
||||||
|
goto out_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = rdma_listen(id, ISER_LISTEN_BACKLOG);
|
||||||
|
if (ret) {
|
||||||
|
PRINT_ERROR("Failed rdma listen, err:%d", ret);
|
||||||
|
goto out_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_INFO("iser portal with cm_id %p listens on %pISpc", id, &sa);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
|
||||||
|
out_id:
|
||||||
|
rdma_destroy_id(id);
|
||||||
|
out:
|
||||||
|
return ERR_PTR(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* create a portal, after listening starts all events
|
/* create a portal, after listening starts all events
|
||||||
* are received in isert_cm_evt_handler()
|
* are received in isert_cm_evt_handler()
|
||||||
*/
|
*/
|
||||||
struct isert_portal *isert_portal_create(void)
|
struct isert_portal *isert_portal_create(struct sockaddr *sa, size_t addr_len)
|
||||||
{
|
{
|
||||||
struct isert_portal *portal;
|
struct isert_portal *portal;
|
||||||
struct rdma_cm_id *cm_id;
|
struct rdma_cm_id *cm_id;
|
||||||
@@ -1803,30 +1864,20 @@ struct isert_portal *isert_portal_create(void)
|
|||||||
goto err_alloc;
|
goto err_alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0) && \
|
INIT_LIST_HEAD(&portal->conn_list);
|
||||||
(!defined(RHEL_MAJOR) || RHEL_MAJOR -0 <= 5)
|
isert_portal_list_add(portal);
|
||||||
cm_id = rdma_create_id(isert_cm_evt_handler, portal, RDMA_PS_TCP);
|
|
||||||
#elif !RDMA_CREATE_ID_TAKES_NET_ARG
|
memcpy(&portal->addr, sa, addr_len);
|
||||||
cm_id = rdma_create_id(isert_cm_evt_handler, portal, RDMA_PS_TCP,
|
|
||||||
IB_QPT_RC);
|
cm_id = isert_setup_id(portal);
|
||||||
#else
|
|
||||||
cm_id = rdma_create_id(iscsi_net_ns, isert_cm_evt_handler, portal,
|
|
||||||
RDMA_PS_TCP, IB_QPT_RC);
|
|
||||||
#endif
|
|
||||||
if (IS_ERR(cm_id)) {
|
if (IS_ERR(cm_id)) {
|
||||||
err = PTR_ERR(cm_id);
|
err = PTR_ERR(cm_id);
|
||||||
PRINT_ERROR("Failed to create rdma id, err:%d", err);
|
PRINT_ERROR("Failed to create rdma id, err:%d", err);
|
||||||
goto create_id_err;
|
goto create_id_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
portal->cm_id = cm_id;
|
portal->cm_id = cm_id;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&portal->conn_list);
|
|
||||||
isert_portal_list_add(portal);
|
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
|
|
||||||
rdma_set_afonly(cm_id, 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PRINT_INFO("Created iser portal cm_id:%p", cm_id);
|
PRINT_INFO("Created iser portal cm_id:%p", cm_id);
|
||||||
out:
|
out:
|
||||||
return portal;
|
return portal;
|
||||||
@@ -1938,17 +1989,5 @@ void isert_portal_release(struct isert_portal *portal)
|
|||||||
|
|
||||||
struct isert_portal *isert_portal_start(struct sockaddr *sa, size_t addr_len)
|
struct isert_portal *isert_portal_start(struct sockaddr *sa, size_t addr_len)
|
||||||
{
|
{
|
||||||
struct isert_portal *portal;
|
return isert_portal_create(sa, addr_len);
|
||||||
int err;
|
|
||||||
|
|
||||||
portal = isert_portal_create();
|
|
||||||
if (IS_ERR(portal))
|
|
||||||
return portal;
|
|
||||||
|
|
||||||
err = isert_portal_listen(portal, sa, addr_len);
|
|
||||||
if (err) {
|
|
||||||
isert_portal_release(portal);
|
|
||||||
portal = ERR_PTR(err);
|
|
||||||
}
|
|
||||||
return portal;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user