xprtrdma: Revert commit d0f36c46de

Device removal is now adequately supported. Pinning the underlying
device driver to prevent removal while an NFS mount is active is no
longer necessary.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Chuck Lever 2017-04-11 13:23:34 -04:00 committed by Anna Schumaker
parent a9b0e381ca
commit 56a6bd154d

View file

@ -53,7 +53,7 @@
#include <linux/sunrpc/addr.h> #include <linux/sunrpc/addr.h>
#include <linux/sunrpc/svc_rdma.h> #include <linux/sunrpc/svc_rdma.h>
#include <asm/bitops.h> #include <asm/bitops.h>
#include <linux/module.h> /* try_module_get()/module_put() */
#include <rdma/ib_cm.h> #include <rdma/ib_cm.h>
#include "xprt_rdma.h" #include "xprt_rdma.h"
@ -344,14 +344,6 @@ connected:
return 0; return 0;
} }
static void rpcrdma_destroy_id(struct rdma_cm_id *id)
{
if (id) {
module_put(id->device->owner);
rdma_destroy_id(id);
}
}
static struct rdma_cm_id * static struct rdma_cm_id *
rpcrdma_create_id(struct rpcrdma_xprt *xprt, rpcrdma_create_id(struct rpcrdma_xprt *xprt,
struct rpcrdma_ia *ia, struct sockaddr *addr) struct rpcrdma_ia *ia, struct sockaddr *addr)
@ -386,16 +378,6 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt,
goto out; goto out;
} }
/* FIXME:
* Until xprtrdma supports DEVICE_REMOVAL, the provider must
* be pinned while there are active NFS/RDMA mounts to prevent
* hangs and crashes at umount time.
*/
if (!ia->ri_async_rc && !try_module_get(id->device->owner)) {
dprintk("RPC: %s: Failed to get device module\n",
__func__);
ia->ri_async_rc = -ENODEV;
}
rc = ia->ri_async_rc; rc = ia->ri_async_rc;
if (rc) if (rc)
goto out; goto out;
@ -405,21 +387,20 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt,
if (rc) { if (rc) {
dprintk("RPC: %s: rdma_resolve_route() failed %i\n", dprintk("RPC: %s: rdma_resolve_route() failed %i\n",
__func__, rc); __func__, rc);
goto put; goto out;
} }
rc = wait_for_completion_interruptible_timeout(&ia->ri_done, wtimeout); rc = wait_for_completion_interruptible_timeout(&ia->ri_done, wtimeout);
if (rc < 0) { if (rc < 0) {
dprintk("RPC: %s: wait() exited: %i\n", dprintk("RPC: %s: wait() exited: %i\n",
__func__, rc); __func__, rc);
goto put; goto out;
} }
rc = ia->ri_async_rc; rc = ia->ri_async_rc;
if (rc) if (rc)
goto put; goto out;
return id; return id;
put:
module_put(id->device->owner);
out: out:
rdma_destroy_id(id); rdma_destroy_id(id);
return ERR_PTR(rc); return ERR_PTR(rc);
@ -546,7 +527,7 @@ rpcrdma_ia_close(struct rpcrdma_ia *ia)
if (ia->ri_id != NULL && !IS_ERR(ia->ri_id)) { if (ia->ri_id != NULL && !IS_ERR(ia->ri_id)) {
if (ia->ri_id->qp) if (ia->ri_id->qp)
rdma_destroy_qp(ia->ri_id); rdma_destroy_qp(ia->ri_id);
rpcrdma_destroy_id(ia->ri_id); rdma_destroy_id(ia->ri_id);
} }
ia->ri_id = NULL; ia->ri_id = NULL;
ia->ri_device = NULL; ia->ri_device = NULL;
@ -800,7 +781,7 @@ rpcrdma_ep_reconnect(struct rpcrdma_xprt *r_xprt, struct rpcrdma_ep *ep,
rdma_destroy_qp(old); rdma_destroy_qp(old);
out_destroy: out_destroy:
rpcrdma_destroy_id(old); rdma_destroy_id(old);
out: out:
return rc; return rc;
} }