On Fri, May 02, 2008 at 11:28:39AM -0500, Tom Tucker wrote: > 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. There's some redundant code in these three error paths; would the usual kernel-style "goto cleanup" thing help? --b. > > Signed-off-by: Tom Tucker <tom@xxxxxxxxxxxxxxxxxxxxx> > > --- > net/sunrpc/xprtrdma/svc_rdma_transport.c | 6 +++--- > 1 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c > index 83818cf..0d9a828 100644 > --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c > +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c > @@ -669,7 +669,7 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, > > 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); > + kfree(cma_xprt); > dprintk("svcrdma: rdma_create_id failed = %ld\n", > PTR_ERR(listen_id)); > return (void *)listen_id; > @@ -677,7 +677,7 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, > ret = rdma_bind_addr(listen_id, sa); > if (ret) { > rdma_destroy_id(listen_id); > - svc_xprt_put(&cma_xprt->sc_xprt); > + kfree(cma_xprt); > dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret); > return ERR_PTR(ret); > } > @@ -686,7 +686,7 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, > ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG); > if (ret) { > rdma_destroy_id(listen_id); > - svc_xprt_put(&cma_xprt->sc_xprt); > + kfree(cma_xprt); > dprintk("svcrdma: rdma_listen failed = %d\n", ret); > return ERR_PTR(ret); > } -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html