projects
/
linux-drm-fsl-dcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
svcrdma: Add class for RDMA backwards direction transport
[linux-drm-fsl-dcu.git]
/
net
/
sunrpc
/
xprtrdma
/
svc_rdma_transport.c
diff --git
a/net/sunrpc/xprtrdma/svc_rdma_transport.c
b/net/sunrpc/xprtrdma/svc_rdma_transport.c
index af86dfeceb4a610af3e50720afd4a07f2406c42a..7fd23955f1d42aa5c1ef907f3d912ff47aecc1cf 100644
(file)
--- a/
net/sunrpc/xprtrdma/svc_rdma_transport.c
+++ b/
net/sunrpc/xprtrdma/svc_rdma_transport.c
@@
-1287,12
+1287,14
@@
static void __svc_rdma_free(struct work_struct *work)
{
struct svcxprt_rdma *rdma =
container_of(work, struct svcxprt_rdma, sc_work);
{
struct svcxprt_rdma *rdma =
container_of(work, struct svcxprt_rdma, sc_work);
- dprintk("svcrdma: svc_rdma_free(%p)\n", rdma);
+ struct svc_xprt *xprt = &rdma->sc_xprt;
+
+ dprintk("svcrdma: %s(%p)\n", __func__, rdma);
/* We should only be called from kref_put */
/* We should only be called from kref_put */
- if (atomic_read(&
rdma->sc_xprt.
xpt_ref.refcount) != 0)
+ if (atomic_read(&
xprt->
xpt_ref.refcount) != 0)
pr_err("svcrdma: sc_xprt still in use? (%d)\n",
pr_err("svcrdma: sc_xprt still in use? (%d)\n",
- atomic_read(&
rdma->sc_xprt.
xpt_ref.refcount));
+ atomic_read(&
xprt->
xpt_ref.refcount));
/*
* Destroy queued, but not processed read completions. Note
/*
* Destroy queued, but not processed read completions. Note
@@
-1327,6
+1329,12
@@
static void __svc_rdma_free(struct work_struct *work)
pr_err("svcrdma: dma still in use? (%d)\n",
atomic_read(&rdma->sc_dma_used));
pr_err("svcrdma: dma still in use? (%d)\n",
atomic_read(&rdma->sc_dma_used));
+ /* Final put of backchannel client transport */
+ if (xprt->xpt_bc_xprt) {
+ xprt_put(xprt->xpt_bc_xprt);
+ xprt->xpt_bc_xprt = NULL;
+ }
+
rdma_dealloc_frmr_q(rdma);
svc_rdma_destroy_ctxts(rdma);
svc_rdma_destroy_maps(rdma);
rdma_dealloc_frmr_q(rdma);
svc_rdma_destroy_ctxts(rdma);
svc_rdma_destroy_maps(rdma);