]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:11:16 +0000 (11:11 +0100)
commit 8ac6fcae5dc0e801f1c82a83f5ae2c0a4db19932 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/sunrpc/xprtrdma/svc_rdma_transport.c

index ca6172822b68aed17f9b6bc25f113de8b4e692a0..3d7f1413df0233ad1b81274bb85ca87e79012218 100644 (file)
@@ -577,6 +577,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;