Skip to content

Commit bf36cf8

Browse files
committed
nfsd: unregister with rpcbind when deleting a transport
JIRA: https://issues.redhat.com/browse/RHEL-115855 Conflicts: include/linux/sunrpc/svc_xprt.h - context difference because RHEL9 doesn't have eccbbc7 ("nfsd: don't use sv_nrthreads in connection limiting calculations.") commit 898374f Author: Olga Kornievskaia <okorniev@redhat.com> Date: Tue Aug 19 14:04:02 2025 -0400 nfsd: unregister with rpcbind when deleting a transport When a listener is added, a part of creation of transport also registers program/port with rpcbind. However, when the listener is removed, while transport goes away, rpcbind still has the entry for that port/type. When deleting the transport, unregister with rpcbind when appropriate. ---v2 created a new xpt_flag XPT_RPCB_UNREG to mark TCP and UDP transport and at xprt destroy send rpcbind unregister if flag set. Suggested-by: Chuck Lever <chuck.lever@oracle.com> Fixes: d093c90 ("nfsd: fix management of listener transports") Cc: stable@vger.kernel.org Signed-off-by: Olga Kornievskaia <okorniev@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Scott Mayhew <smayhew@redhat.com>
1 parent aac39d6 commit bf36cf8

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

include/linux/sunrpc/svc_xprt.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ enum {
9999
XPT_HANDSHAKE, /* xprt requests a handshake */
100100
XPT_TLS_SESSION, /* transport-layer security established */
101101
XPT_PEER_AUTH, /* peer has been authenticated */
102+
XPT_RPCB_UNREG, /* transport that needs unregistering
103+
* with rpcbind (TCP, UDP) on destroy
104+
*/
102105
};
103106

104107
static inline void unregister_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u)

net/sunrpc/svc_xprt.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,19 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
10381038
struct svc_serv *serv = xprt->xpt_server;
10391039
struct svc_deferred_req *dr;
10401040

1041+
/* unregister with rpcbind for when transport type is TCP or UDP.
1042+
*/
1043+
if (test_bit(XPT_RPCB_UNREG, &xprt->xpt_flags)) {
1044+
struct svc_sock *svsk = container_of(xprt, struct svc_sock,
1045+
sk_xprt);
1046+
struct socket *sock = svsk->sk_sock;
1047+
1048+
if (svc_register(serv, xprt->xpt_net, sock->sk->sk_family,
1049+
sock->sk->sk_protocol, 0) < 0)
1050+
pr_warn("failed to unregister %s with rpcbind\n",
1051+
xprt->xpt_class->xcl_name);
1052+
}
1053+
10411054
if (test_and_set_bit(XPT_DEAD, &xprt->xpt_flags))
10421055
return;
10431056

net/sunrpc/svcsock.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,7 @@ static void svc_udp_init(struct svc_sock *svsk, struct svc_serv *serv)
836836
/* data might have come in before data_ready set up */
837837
set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
838838
set_bit(XPT_CHNGBUF, &svsk->sk_xprt.xpt_flags);
839+
set_bit(XPT_RPCB_UNREG, &svsk->sk_xprt.xpt_flags);
839840

840841
/* make sure we get destination address info */
841842
switch (svsk->sk_sk->sk_family) {
@@ -1406,6 +1407,7 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
14061407
if (sk->sk_state == TCP_LISTEN) {
14071408
strcpy(svsk->sk_xprt.xpt_remotebuf, "listener");
14081409
set_bit(XPT_LISTENER, &svsk->sk_xprt.xpt_flags);
1410+
set_bit(XPT_RPCB_UNREG, &svsk->sk_xprt.xpt_flags);
14091411
sk->sk_data_ready = svc_tcp_listen_data_ready;
14101412
set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
14111413
} else {

0 commit comments

Comments
 (0)