aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_ipv4.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r--net/ipv4/tcp_ipv4.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 020766292bb0..69ccbc1dde9c 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -415,6 +415,9 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
415 !icsk->icsk_backoff) 415 !icsk->icsk_backoff)
416 break; 416 break;
417 417
418 if (sock_owned_by_user(sk))
419 break;
420
418 icsk->icsk_backoff--; 421 icsk->icsk_backoff--;
419 inet_csk(sk)->icsk_rto = __tcp_set_rto(tp) << 422 inet_csk(sk)->icsk_rto = __tcp_set_rto(tp) <<
420 icsk->icsk_backoff; 423 icsk->icsk_backoff;
@@ -429,11 +432,6 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
429 if (remaining) { 432 if (remaining) {
430 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, 433 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
431 remaining, TCP_RTO_MAX); 434 remaining, TCP_RTO_MAX);
432 } else if (sock_owned_by_user(sk)) {
433 /* RTO revert clocked out retransmission,
434 * but socket is locked. Will defer. */
435 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
436 HZ/20, TCP_RTO_MAX);
437 } else { 435 } else {
438 /* RTO revert clocked out retransmission. 436 /* RTO revert clocked out retransmission.
439 * Will retransmit now */ 437 * Will retransmit now */
@@ -1422,7 +1420,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1422 1420
1423 newsk = tcp_create_openreq_child(sk, req, skb); 1421 newsk = tcp_create_openreq_child(sk, req, skb);
1424 if (!newsk) 1422 if (!newsk)
1425 goto exit; 1423 goto exit_nonewsk;
1426 1424
1427 newsk->sk_gso_type = SKB_GSO_TCPV4; 1425 newsk->sk_gso_type = SKB_GSO_TCPV4;
1428 sk_setup_caps(newsk, dst); 1426 sk_setup_caps(newsk, dst);
@@ -1469,16 +1467,20 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1469 } 1467 }
1470#endif 1468#endif
1471 1469
1470 if (__inet_inherit_port(sk, newsk) < 0) {
1471 sock_put(newsk);
1472 goto exit;
1473 }
1472 __inet_hash_nolisten(newsk, NULL); 1474 __inet_hash_nolisten(newsk, NULL);
1473 __inet_inherit_port(sk, newsk);
1474 1475
1475 return newsk; 1476 return newsk;
1476 1477
1477exit_overflow: 1478exit_overflow:
1478 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS); 1479 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
1480exit_nonewsk:
1481 dst_release(dst);
1479exit: 1482exit:
1480 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); 1483 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1481 dst_release(dst);
1482 return NULL; 1484 return NULL;
1483} 1485}
1484EXPORT_SYMBOL(tcp_v4_syn_recv_sock); 1486EXPORT_SYMBOL(tcp_v4_syn_recv_sock);
@@ -2571,7 +2573,6 @@ struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb)
2571 2573
2572 return tcp_gro_receive(head, skb); 2574 return tcp_gro_receive(head, skb);
2573} 2575}
2574EXPORT_SYMBOL(tcp4_gro_receive);
2575 2576
2576int tcp4_gro_complete(struct sk_buff *skb) 2577int tcp4_gro_complete(struct sk_buff *skb)
2577{ 2578{
@@ -2584,7 +2585,6 @@ int tcp4_gro_complete(struct sk_buff *skb)
2584 2585
2585 return tcp_gro_complete(skb); 2586 return tcp_gro_complete(skb);
2586} 2587}
2587EXPORT_SYMBOL(tcp4_gro_complete);
2588 2588
2589struct proto tcp_prot = { 2589struct proto tcp_prot = {
2590 .name = "TCP", 2590 .name = "TCP",