aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/drbd/drbd_receiver.c6
-rw-r--r--drivers/scsi/iscsi_tcp.c2
-rw-r--r--drivers/staging/ramster/cluster/tcp.c2
-rw-r--r--fs/ocfs2/cluster/tcp.c2
-rw-r--r--include/net/sock.h11
-rw-r--r--net/core/sock.c2
-rw-r--r--net/econet/af_econet.c4
-rw-r--r--net/ipv4/af_inet.c2
-rw-r--r--net/ipv4/inet_connection_sock.c3
-rw-r--r--net/ipv6/af_inet6.c2
-rw-r--r--net/netfilter/ipvs/ip_vs_sync.c2
-rw-r--r--net/rds/tcp_listen.c2
-rw-r--r--net/sunrpc/svcsock.c2
13 files changed, 28 insertions, 14 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 43beaca53179..436f519bed1c 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -664,7 +664,7 @@ static struct socket *drbd_wait_for_connect(struct drbd_conf *mdev)
664 timeo = mdev->net_conf->try_connect_int * HZ; 664 timeo = mdev->net_conf->try_connect_int * HZ;
665 timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */ 665 timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */
666 666
667 s_listen->sk->sk_reuse = 1; /* SO_REUSEADDR */ 667 s_listen->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
668 s_listen->sk->sk_rcvtimeo = timeo; 668 s_listen->sk->sk_rcvtimeo = timeo;
669 s_listen->sk->sk_sndtimeo = timeo; 669 s_listen->sk->sk_sndtimeo = timeo;
670 drbd_setbufsize(s_listen, mdev->net_conf->sndbuf_size, 670 drbd_setbufsize(s_listen, mdev->net_conf->sndbuf_size,
@@ -841,8 +841,8 @@ retry:
841 } 841 }
842 } while (1); 842 } while (1);
843 843
844 msock->sk->sk_reuse = 1; /* SO_REUSEADDR */ 844 msock->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
845 sock->sk->sk_reuse = 1; /* SO_REUSEADDR */ 845 sock->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
846 846
847 sock->sk->sk_allocation = GFP_NOIO; 847 sock->sk->sk_allocation = GFP_NOIO;
848 msock->sk->sk_allocation = GFP_NOIO; 848 msock->sk->sk_allocation = GFP_NOIO;
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 453a740fa68e..922086105b4b 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -662,7 +662,7 @@ iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
662 662
663 /* setup Socket parameters */ 663 /* setup Socket parameters */
664 sk = sock->sk; 664 sk = sock->sk;
665 sk->sk_reuse = 1; 665 sk->sk_reuse = SK_CAN_REUSE;
666 sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */ 666 sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
667 sk->sk_allocation = GFP_ATOMIC; 667 sk->sk_allocation = GFP_ATOMIC;
668 668
diff --git a/drivers/staging/ramster/cluster/tcp.c b/drivers/staging/ramster/cluster/tcp.c
index 3af1b2c51b78..b9721c1055b1 100644
--- a/drivers/staging/ramster/cluster/tcp.c
+++ b/drivers/staging/ramster/cluster/tcp.c
@@ -2106,7 +2106,7 @@ static int r2net_open_listening_sock(__be32 addr, __be16 port)
2106 r2net_listen_sock = sock; 2106 r2net_listen_sock = sock;
2107 INIT_WORK(&r2net_listen_work, r2net_accept_many); 2107 INIT_WORK(&r2net_listen_work, r2net_accept_many);
2108 2108
2109 sock->sk->sk_reuse = 1; 2109 sock->sk->sk_reuse = SK_CAN_REUSE;
2110 ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); 2110 ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
2111 if (ret < 0) { 2111 if (ret < 0) {
2112 printk(KERN_ERR "ramster: Error %d while binding socket at " 2112 printk(KERN_ERR "ramster: Error %d while binding socket at "
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index 044e7b58d31c..1bfe8802cc1e 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -2005,7 +2005,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)
2005 o2net_listen_sock = sock; 2005 o2net_listen_sock = sock;
2006 INIT_WORK(&o2net_listen_work, o2net_accept_many); 2006 INIT_WORK(&o2net_listen_work, o2net_accept_many);
2007 2007
2008 sock->sk->sk_reuse = 1; 2008 sock->sk->sk_reuse = SK_CAN_REUSE;
2009 ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); 2009 ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
2010 if (ret < 0) { 2010 if (ret < 0) {
2011 printk(KERN_ERR "o2net: Error %d while binding socket at " 2011 printk(KERN_ERR "o2net: Error %d while binding socket at "
diff --git a/include/net/sock.h b/include/net/sock.h
index a6ba1f8871fd..4cdb9b3050f4 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -376,6 +376,17 @@ struct sock {
376 void (*sk_destruct)(struct sock *sk); 376 void (*sk_destruct)(struct sock *sk);
377}; 377};
378 378
379/*
380 * SK_CAN_REUSE and SK_NO_REUSE on a socket mean that the socket is OK
381 * or not whether his port will be reused by someone else. SK_FORCE_REUSE
382 * on a socket means that the socket will reuse everybody else's port
383 * without looking at the other's sk_reuse value.
384 */
385
386#define SK_NO_REUSE 0
387#define SK_CAN_REUSE 1
388#define SK_FORCE_REUSE 2
389
379static inline int sk_peek_offset(struct sock *sk, int flags) 390static inline int sk_peek_offset(struct sock *sk, int flags)
380{ 391{
381 if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0)) 392 if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0))
diff --git a/net/core/sock.c b/net/core/sock.c
index c7e60eac639b..679c5bbe2bed 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -561,7 +561,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
561 sock_valbool_flag(sk, SOCK_DBG, valbool); 561 sock_valbool_flag(sk, SOCK_DBG, valbool);
562 break; 562 break;
563 case SO_REUSEADDR: 563 case SO_REUSEADDR:
564 sk->sk_reuse = valbool; 564 sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
565 break; 565 break;
566 case SO_TYPE: 566 case SO_TYPE:
567 case SO_PROTOCOL: 567 case SO_PROTOCOL:
diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c
index 71b5edcee401..fa14ca76b77b 100644
--- a/net/econet/af_econet.c
+++ b/net/econet/af_econet.c
@@ -617,7 +617,7 @@ static int econet_create(struct net *net, struct socket *sock, int protocol,
617 if (sk == NULL) 617 if (sk == NULL)
618 goto out; 618 goto out;
619 619
620 sk->sk_reuse = 1; 620 sk->sk_reuse = SK_CAN_REUSE;
621 sock->ops = &econet_ops; 621 sock->ops = &econet_ops;
622 sock_init_data(sock, sk); 622 sock_init_data(sock, sk);
623 623
@@ -1012,7 +1012,7 @@ static int __init aun_udp_initialise(void)
1012 return error; 1012 return error;
1013 } 1013 }
1014 1014
1015 udpsock->sk->sk_reuse = 1; 1015 udpsock->sk->sk_reuse = SK_CAN_REUSE;
1016 udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it 1016 udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it
1017 from interrupts */ 1017 from interrupts */
1018 1018
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 3744c1c0af5a..c8f7aee587d1 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -350,7 +350,7 @@ lookup_protocol:
350 err = 0; 350 err = 0;
351 sk->sk_no_check = answer_no_check; 351 sk->sk_no_check = answer_no_check;
352 if (INET_PROTOSW_REUSE & answer_flags) 352 if (INET_PROTOSW_REUSE & answer_flags)
353 sk->sk_reuse = 1; 353 sk->sk_reuse = SK_CAN_REUSE;
354 354
355 inet = inet_sk(sk); 355 inet = inet_sk(sk);
356 inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; 356 inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index 7d972f650a61..95e61596e605 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -182,6 +182,9 @@ have_snum:
182 goto tb_not_found; 182 goto tb_not_found;
183tb_found: 183tb_found:
184 if (!hlist_empty(&tb->owners)) { 184 if (!hlist_empty(&tb->owners)) {
185 if (sk->sk_reuse == SK_FORCE_REUSE)
186 goto success;
187
185 if (tb->fastreuse > 0 && 188 if (tb->fastreuse > 0 &&
186 sk->sk_reuse && sk->sk_state != TCP_LISTEN && 189 sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
187 smallest_size == -1) { 190 smallest_size == -1) {
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 461e7896e5d8..0ad046c7ae95 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -180,7 +180,7 @@ lookup_protocol:
180 err = 0; 180 err = 0;
181 sk->sk_no_check = answer_no_check; 181 sk->sk_no_check = answer_no_check;
182 if (INET_PROTOSW_REUSE & answer_flags) 182 if (INET_PROTOSW_REUSE & answer_flags)
183 sk->sk_reuse = 1; 183 sk->sk_reuse = SK_CAN_REUSE;
184 184
185 inet = inet_sk(sk); 185 inet = inet_sk(sk);
186 inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; 186 inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
index f4e0b6cf8246..bf5e538af67b 100644
--- a/net/netfilter/ipvs/ip_vs_sync.c
+++ b/net/netfilter/ipvs/ip_vs_sync.c
@@ -1368,7 +1368,7 @@ static struct socket *make_receive_sock(struct net *net)
1368 */ 1368 */
1369 sk_change_net(sock->sk, net); 1369 sk_change_net(sock->sk, net);
1370 /* it is equivalent to the REUSEADDR option in user-space */ 1370 /* it is equivalent to the REUSEADDR option in user-space */
1371 sock->sk->sk_reuse = 1; 1371 sock->sk->sk_reuse = SK_CAN_REUSE;
1372 1372
1373 result = sock->ops->bind(sock, (struct sockaddr *) &mcast_addr, 1373 result = sock->ops->bind(sock, (struct sockaddr *) &mcast_addr,
1374 sizeof(struct sockaddr)); 1374 sizeof(struct sockaddr));
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index 8b5cc4aa8868..72981375f47c 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -145,7 +145,7 @@ int rds_tcp_listen_init(void)
145 if (ret < 0) 145 if (ret < 0)
146 goto out; 146 goto out;
147 147
148 sock->sk->sk_reuse = 1; 148 sock->sk->sk_reuse = SK_CAN_REUSE;
149 rds_tcp_nonagle(sock); 149 rds_tcp_nonagle(sock);
150 150
151 write_lock_bh(&sock->sk->sk_callback_lock); 151 write_lock_bh(&sock->sk->sk_callback_lock);
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 824d32fb3121..f0132b2e875e 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -1556,7 +1556,7 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,
1556 (char *)&val, sizeof(val)); 1556 (char *)&val, sizeof(val));
1557 1557
1558 if (type == SOCK_STREAM) 1558 if (type == SOCK_STREAM)
1559 sock->sk->sk_reuse = 1; /* allow address reuse */ 1559 sock->sk->sk_reuse = SK_CAN_REUSE; /* allow address reuse */
1560 error = kernel_bind(sock, sin, len); 1560 error = kernel_bind(sock, sin, len);
1561 if (error < 0) 1561 if (error < 0)
1562 goto bummer; 1562 goto bummer;