diff options
author | Shirley Ma <shirley.ma@oracle.com> | 2015-07-09 16:45:08 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2015-07-20 14:58:47 -0400 |
commit | ff79c74dcace8fec62706d0bef00b6680b477fdb (patch) | |
tree | cfef2fd4176988a6f9b2b81a9500884cbefd181f /net/sunrpc/xprtrdma/svc_rdma_transport.c | |
parent | 7b8f4586532f36c5541a15d072576e7e89a5df75 (diff) | |
download | op-kernel-dev-ff79c74dcace8fec62706d0bef00b6680b477fdb.zip op-kernel-dev-ff79c74dcace8fec62706d0bef00b6680b477fdb.tar.gz |
NFS/RDMA Release resources in svcrdma when device is removed
When removing underlying RDMA device, the rmmod will hang forever if there
are any outstanding NFS/RDMA client mounts. The outstanding NFS/RDMA counts
could also prevent the server from shutting down. Further debugging shows
that the existing connections are not teared down and resource are not
released when receiving RDMA_CM_EVENT_DEVICE_REMOVAL event. It seems the
original code missing svc_xprt_put() in RDMA_CM_EVENT_REMOVAL event handler
thus svc_xprt_free is never invoked to release the existing connection
resources.
The patch has been passed removing, adding device back and forth without
stopping NFS/RDMA service. This will also allow a device to be unplugged
and swapped out without shutting down NFS service.
BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=252
Signed-off-by: Shirley Ma <shirley.ma@oracle.com>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net/sunrpc/xprtrdma/svc_rdma_transport.c')
-rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_transport.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 6b36279..f4b9732 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c @@ -659,6 +659,7 @@ static int rdma_cma_handler(struct rdma_cm_id *cma_id, if (xprt) { set_bit(XPT_CLOSE, &xprt->xpt_flags); svc_xprt_enqueue(xprt); + svc_xprt_put(xprt); } break; default: |