]> www.infradead.org Git - users/hch/misc.git/commitdiff
svcrdma: Unregister the device if svc_rdma_accept() fails
authorChuck Lever <chuck.lever@oracle.com>
Sun, 27 Apr 2025 16:39:59 +0000 (12:39 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 11 May 2025 23:48:28 +0000 (19:48 -0400)
To handle device removal, svc_rdma_accept() requests removal
notification for the underlying device when accepting a connection.
However svc_rdma_free() is not invoked if svc_rdma_accept() fails.
There needs to be a matching "unregister" in that case; otherwise
the device cannot be removed.

Fixes: c4de97f7c454 ("svcrdma: Handle device removal outside of the CM event handler")
Cc: stable@vger.kernel.org
Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/xprtrdma/svc_rdma_transport.c

index aca8bdf65d729fd96ef7eff7eb0ffe2f97c36934..5940a56023d152e623448e8648c35caa912c85ce 100644 (file)
@@ -575,6 +575,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
        if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp))
                ib_destroy_qp(newxprt->sc_qp);
        rdma_destroy_id(newxprt->sc_cm_id);
+       rpcrdma_rn_unregister(dev, &newxprt->sc_rn);
        /* This call to put will destroy the transport */
        svc_xprt_put(&newxprt->sc_xprt);
        return NULL;