SPECS/linux/SUNRPC-xs_bind-uses-ip_local_reserved_ports.patch
525d3066
 From 5ff0b9e728e23e54001c2bb6df29d85ac2c5e08f Mon Sep 17 00:00:00 2001
 From: Alexey Makhalov <amakhalov@vmware.com>
 Date: Fri, 25 Mar 2016 21:51:12 +0000
 Subject: [PATCH] sunrpc: xs_bind uses ip_local_reserved_ports
 
 ---
  net/sunrpc/xprtsock.c | 7 ++++++-
  1 file changed, 6 insertions(+), 1 deletion(-)
 
 diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
 index 2ffaf6a..90543d6 100644
 --- a/net/sunrpc/xprtsock.c
 +++ b/net/sunrpc/xprtsock.c
 @@ -1798,9 +1798,11 @@ static unsigned short xs_next_srcport(struct sock_xprt *transport, unsigned shor
28755687
  static int xs_bind(struct sock_xprt *transport, struct socket *sock)
  {
  	struct sockaddr_storage myaddr;
 -	int err, nloop = 0;
 +	int err = -EADDRINUSE;
 +	int nloop = 0;
  	unsigned short port = xs_get_srcport(transport);
  	unsigned short last;
 +	struct net *net = transport->xprt.xprt_net;
  
  	/*
  	 * If we are asking for any ephemeral port (i.e. port == 0 &&
525d3066
 @@ -1822,6 +1824,8 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock)
28755687
  
  	memcpy(&myaddr, &transport->srcaddr, transport->xprt.addrlen);
  	do {
 +		if (inet_is_local_reserved_port(net, port))
 +			goto next_port;
  		rpc_set_port((struct sockaddr *)&myaddr, port);
  		err = kernel_bind(sock, (struct sockaddr *)&myaddr,
  				transport->xprt.addrlen);
525d3066
 @@ -1829,6 +1833,7 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock)
28755687
  			transport->srcport = port;
  			break;
  		}
 +next_port:
  		last = port;
  		port = xs_next_srcport(transport, port);
  		if (port > last)
525d3066
 -- 
 1.9.1