Commit 58e8f621 authored by Tom Tucker's avatar Tom Tucker

svcrdma: Fix error handling during listening endpoint creation

A listening endpoint isn't known to the generic transport switch until
the svc_create_xprt function returns without error. Calling
svc_xprt_put within the xpo_create function causes the module reference
count to be erroneously decremented.
Signed-off-by: default avatarTom Tucker <tom@opengridcomputing.com>
parent 5ac461a6
...@@ -667,31 +667,27 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, ...@@ -667,31 +667,27 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
cma_xprt = rdma_create_xprt(serv, 1); cma_xprt = rdma_create_xprt(serv, 1);
if (!cma_xprt) if (!cma_xprt)
return ERR_PTR(ENOMEM); return ERR_PTR(-ENOMEM);
xprt = &cma_xprt->sc_xprt; xprt = &cma_xprt->sc_xprt;
listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP); listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP);
if (IS_ERR(listen_id)) { if (IS_ERR(listen_id)) {
svc_xprt_put(&cma_xprt->sc_xprt); ret = PTR_ERR(listen_id);
dprintk("svcrdma: rdma_create_id failed = %ld\n", dprintk("svcrdma: rdma_create_id failed = %d\n", ret);
PTR_ERR(listen_id)); goto err0;
return (void *)listen_id;
} }
ret = rdma_bind_addr(listen_id, sa); ret = rdma_bind_addr(listen_id, sa);
if (ret) { if (ret) {
rdma_destroy_id(listen_id);
svc_xprt_put(&cma_xprt->sc_xprt);
dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret); dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret);
return ERR_PTR(ret); goto err1;
} }
cma_xprt->sc_cm_id = listen_id; cma_xprt->sc_cm_id = listen_id;
ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG); ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG);
if (ret) { if (ret) {
rdma_destroy_id(listen_id);
svc_xprt_put(&cma_xprt->sc_xprt);
dprintk("svcrdma: rdma_listen failed = %d\n", ret); dprintk("svcrdma: rdma_listen failed = %d\n", ret);
return ERR_PTR(ret); goto err1;
} }
/* /*
...@@ -702,6 +698,12 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, ...@@ -702,6 +698,12 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
svc_xprt_set_local(&cma_xprt->sc_xprt, sa, salen); svc_xprt_set_local(&cma_xprt->sc_xprt, sa, salen);
return &cma_xprt->sc_xprt; return &cma_xprt->sc_xprt;
err1:
rdma_destroy_id(listen_id);
err0:
kfree(cma_xprt);
return ERR_PTR(ret);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment