Commit 4a17fd52 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

sock: Introduce named constants for sk_reuse

Name them in a "backward compatible" manner, i.e. reuse or not
are still 1 and 0 respectively. The reuse value of 2 means that
the socket with it will forcibly reuse everyone else's port.
Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 59c55bdd
...@@ -664,7 +664,7 @@ static struct socket *drbd_wait_for_connect(struct drbd_conf *mdev) ...@@ -664,7 +664,7 @@ static struct socket *drbd_wait_for_connect(struct drbd_conf *mdev)
timeo = mdev->net_conf->try_connect_int * HZ; timeo = mdev->net_conf->try_connect_int * HZ;
timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */ timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */
s_listen->sk->sk_reuse = 1; /* SO_REUSEADDR */ s_listen->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
s_listen->sk->sk_rcvtimeo = timeo; s_listen->sk->sk_rcvtimeo = timeo;
s_listen->sk->sk_sndtimeo = timeo; s_listen->sk->sk_sndtimeo = timeo;
drbd_setbufsize(s_listen, mdev->net_conf->sndbuf_size, drbd_setbufsize(s_listen, mdev->net_conf->sndbuf_size,
...@@ -841,8 +841,8 @@ static int drbd_connect(struct drbd_conf *mdev) ...@@ -841,8 +841,8 @@ static int drbd_connect(struct drbd_conf *mdev)
} }
} while (1); } while (1);
msock->sk->sk_reuse = 1; /* SO_REUSEADDR */ msock->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
sock->sk->sk_reuse = 1; /* SO_REUSEADDR */ sock->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
sock->sk->sk_allocation = GFP_NOIO; sock->sk->sk_allocation = GFP_NOIO;
msock->sk->sk_allocation = GFP_NOIO; msock->sk->sk_allocation = GFP_NOIO;
......
...@@ -662,7 +662,7 @@ iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session, ...@@ -662,7 +662,7 @@ iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
/* setup Socket parameters */ /* setup Socket parameters */
sk = sock->sk; sk = sock->sk;
sk->sk_reuse = 1; sk->sk_reuse = SK_CAN_REUSE;
sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */ sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
sk->sk_allocation = GFP_ATOMIC; sk->sk_allocation = GFP_ATOMIC;
......
...@@ -2106,7 +2106,7 @@ static int r2net_open_listening_sock(__be32 addr, __be16 port) ...@@ -2106,7 +2106,7 @@ static int r2net_open_listening_sock(__be32 addr, __be16 port)
r2net_listen_sock = sock; r2net_listen_sock = sock;
INIT_WORK(&r2net_listen_work, r2net_accept_many); INIT_WORK(&r2net_listen_work, r2net_accept_many);
sock->sk->sk_reuse = 1; sock->sk->sk_reuse = SK_CAN_REUSE;
ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "ramster: Error %d while binding socket at " printk(KERN_ERR "ramster: Error %d while binding socket at "
......
...@@ -2005,7 +2005,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port) ...@@ -2005,7 +2005,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)
o2net_listen_sock = sock; o2net_listen_sock = sock;
INIT_WORK(&o2net_listen_work, o2net_accept_many); INIT_WORK(&o2net_listen_work, o2net_accept_many);
sock->sk->sk_reuse = 1; sock->sk->sk_reuse = SK_CAN_REUSE;
ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "o2net: Error %d while binding socket at " printk(KERN_ERR "o2net: Error %d while binding socket at "
......
...@@ -376,6 +376,17 @@ struct sock { ...@@ -376,6 +376,17 @@ struct sock {
void (*sk_destruct)(struct sock *sk); void (*sk_destruct)(struct sock *sk);
}; };
/*
* SK_CAN_REUSE and SK_NO_REUSE on a socket mean that the socket is OK
* or not whether his port will be reused by someone else. SK_FORCE_REUSE
* on a socket means that the socket will reuse everybody else's port
* without looking at the other's sk_reuse value.
*/
#define SK_NO_REUSE 0
#define SK_CAN_REUSE 1
#define SK_FORCE_REUSE 2
static inline int sk_peek_offset(struct sock *sk, int flags) static inline int sk_peek_offset(struct sock *sk, int flags)
{ {
if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0)) if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0))
......
...@@ -561,7 +561,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -561,7 +561,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
sock_valbool_flag(sk, SOCK_DBG, valbool); sock_valbool_flag(sk, SOCK_DBG, valbool);
break; break;
case SO_REUSEADDR: case SO_REUSEADDR:
sk->sk_reuse = valbool; sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
break; break;
case SO_TYPE: case SO_TYPE:
case SO_PROTOCOL: case SO_PROTOCOL:
......
...@@ -617,7 +617,7 @@ static int econet_create(struct net *net, struct socket *sock, int protocol, ...@@ -617,7 +617,7 @@ static int econet_create(struct net *net, struct socket *sock, int protocol,
if (sk == NULL) if (sk == NULL)
goto out; goto out;
sk->sk_reuse = 1; sk->sk_reuse = SK_CAN_REUSE;
sock->ops = &econet_ops; sock->ops = &econet_ops;
sock_init_data(sock, sk); sock_init_data(sock, sk);
...@@ -1012,7 +1012,7 @@ static int __init aun_udp_initialise(void) ...@@ -1012,7 +1012,7 @@ static int __init aun_udp_initialise(void)
return error; return error;
} }
udpsock->sk->sk_reuse = 1; udpsock->sk->sk_reuse = SK_CAN_REUSE;
udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it
from interrupts */ from interrupts */
......
...@@ -350,7 +350,7 @@ static int inet_create(struct net *net, struct socket *sock, int protocol, ...@@ -350,7 +350,7 @@ static int inet_create(struct net *net, struct socket *sock, int protocol,
err = 0; err = 0;
sk->sk_no_check = answer_no_check; sk->sk_no_check = answer_no_check;
if (INET_PROTOSW_REUSE & answer_flags) if (INET_PROTOSW_REUSE & answer_flags)
sk->sk_reuse = 1; sk->sk_reuse = SK_CAN_REUSE;
inet = inet_sk(sk); inet = inet_sk(sk);
inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
......
...@@ -182,6 +182,9 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum) ...@@ -182,6 +182,9 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum)
goto tb_not_found; goto tb_not_found;
tb_found: tb_found:
if (!hlist_empty(&tb->owners)) { if (!hlist_empty(&tb->owners)) {
if (sk->sk_reuse == SK_FORCE_REUSE)
goto success;
if (tb->fastreuse > 0 && if (tb->fastreuse > 0 &&
sk->sk_reuse && sk->sk_state != TCP_LISTEN && sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
smallest_size == -1) { smallest_size == -1) {
......
...@@ -180,7 +180,7 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol, ...@@ -180,7 +180,7 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,
err = 0; err = 0;
sk->sk_no_check = answer_no_check; sk->sk_no_check = answer_no_check;
if (INET_PROTOSW_REUSE & answer_flags) if (INET_PROTOSW_REUSE & answer_flags)
sk->sk_reuse = 1; sk->sk_reuse = SK_CAN_REUSE;
inet = inet_sk(sk); inet = inet_sk(sk);
inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
......
...@@ -1368,7 +1368,7 @@ static struct socket *make_receive_sock(struct net *net) ...@@ -1368,7 +1368,7 @@ static struct socket *make_receive_sock(struct net *net)
*/ */
sk_change_net(sock->sk, net); sk_change_net(sock->sk, net);
/* it is equivalent to the REUSEADDR option in user-space */ /* it is equivalent to the REUSEADDR option in user-space */
sock->sk->sk_reuse = 1; sock->sk->sk_reuse = SK_CAN_REUSE;
result = sock->ops->bind(sock, (struct sockaddr *) &mcast_addr, result = sock->ops->bind(sock, (struct sockaddr *) &mcast_addr,
sizeof(struct sockaddr)); sizeof(struct sockaddr));
......
...@@ -145,7 +145,7 @@ int rds_tcp_listen_init(void) ...@@ -145,7 +145,7 @@ int rds_tcp_listen_init(void)
if (ret < 0) if (ret < 0)
goto out; goto out;
sock->sk->sk_reuse = 1; sock->sk->sk_reuse = SK_CAN_REUSE;
rds_tcp_nonagle(sock); rds_tcp_nonagle(sock);
write_lock_bh(&sock->sk->sk_callback_lock); write_lock_bh(&sock->sk->sk_callback_lock);
......
...@@ -1556,7 +1556,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv, ...@@ -1556,7 +1556,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,
(char *)&val, sizeof(val)); (char *)&val, sizeof(val));
if (type == SOCK_STREAM) if (type == SOCK_STREAM)
sock->sk->sk_reuse = 1; /* allow address reuse */ sock->sk->sk_reuse = SK_CAN_REUSE; /* allow address reuse */
error = kernel_bind(sock, sin, len); error = kernel_bind(sock, sin, len);
if (error < 0) if (error < 0)
goto bummer; goto bummer;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment