diff options
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 6 | ||||
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 2 | ||||
-rw-r--r-- | drivers/staging/ramster/cluster/tcp.c | 2 | ||||
-rw-r--r-- | fs/ocfs2/cluster/tcp.c | 2 | ||||
-rw-r--r-- | include/net/sock.h | 11 | ||||
-rw-r--r-- | net/core/sock.c | 2 | ||||
-rw-r--r-- | net/econet/af_econet.c | 4 | ||||
-rw-r--r-- | net/ipv4/af_inet.c | 2 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 3 | ||||
-rw-r--r-- | net/ipv6/af_inet6.c | 2 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_sync.c | 2 | ||||
-rw-r--r-- | net/rds/tcp_listen.c | 2 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 2 |
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 | |||
379 | static inline int sk_peek_offset(struct sock *sk, int flags) | 390 | static 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; |
183 | tb_found: | 183 | tb_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; |