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: Tom Tucker <tom@opengridcomputing.com>
This commit is contained in:
Родитель
5ac461a6f0
Коммит
58e8f62137
|
@ -667,31 +667,27 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
|
|||
|
||||
cma_xprt = rdma_create_xprt(serv, 1);
|
||||
if (!cma_xprt)
|
||||
return ERR_PTR(ENOMEM);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
xprt = &cma_xprt->sc_xprt;
|
||||
|
||||
listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP);
|
||||
if (IS_ERR(listen_id)) {
|
||||
svc_xprt_put(&cma_xprt->sc_xprt);
|
||||
dprintk("svcrdma: rdma_create_id failed = %ld\n",
|
||||
PTR_ERR(listen_id));
|
||||
return (void *)listen_id;
|
||||
ret = PTR_ERR(listen_id);
|
||||
dprintk("svcrdma: rdma_create_id failed = %d\n", ret);
|
||||
goto err0;
|
||||
}
|
||||
|
||||
ret = rdma_bind_addr(listen_id, sa);
|
||||
if (ret) {
|
||||
rdma_destroy_id(listen_id);
|
||||
svc_xprt_put(&cma_xprt->sc_xprt);
|
||||
dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret);
|
||||
return ERR_PTR(ret);
|
||||
goto err1;
|
||||
}
|
||||
cma_xprt->sc_cm_id = listen_id;
|
||||
|
||||
ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG);
|
||||
if (ret) {
|
||||
rdma_destroy_id(listen_id);
|
||||
svc_xprt_put(&cma_xprt->sc_xprt);
|
||||
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,
|
|||
svc_xprt_set_local(&cma_xprt->sc_xprt, sa, salen);
|
||||
|
||||
return &cma_xprt->sc_xprt;
|
||||
|
||||
err1:
|
||||
rdma_destroy_id(listen_id);
|
||||
err0:
|
||||
kfree(cma_xprt);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче