aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/request_sock.h12
-rw-r--r--net/ipv4/tcp_input.c2
2 files changed, 10 insertions, 4 deletions
diff --git a/include/net/request_sock.h b/include/net/request_sock.h
index 56dc2faba47e..723d1cbdf20e 100644
--- a/include/net/request_sock.h
+++ b/include/net/request_sock.h
@@ -52,6 +52,7 @@ struct request_sock {
52#define rsk_refcnt __req_common.skc_refcnt 52#define rsk_refcnt __req_common.skc_refcnt
53 53
54 struct request_sock *dl_next; 54 struct request_sock *dl_next;
55 struct sock *rsk_listener;
55 u16 mss; 56 u16 mss;
56 u8 num_retrans; /* number of retransmits */ 57 u8 num_retrans; /* number of retransmits */
57 u8 cookie_ts:1; /* syncookie: encode tcpopts in timestamp */ 58 u8 cookie_ts:1; /* syncookie: encode tcpopts in timestamp */
@@ -67,13 +68,16 @@ struct request_sock {
67 u32 peer_secid; 68 u32 peer_secid;
68}; 69};
69 70
70static inline struct request_sock *reqsk_alloc(const struct request_sock_ops *ops) 71static inline struct request_sock *
72reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener)
71{ 73{
72 struct request_sock *req = kmem_cache_alloc(ops->slab, GFP_ATOMIC); 74 struct request_sock *req = kmem_cache_alloc(ops->slab, GFP_ATOMIC);
73 75
74 if (req != NULL) 76 if (req) {
75 req->rsk_ops = ops; 77 req->rsk_ops = ops;
76 78 sock_hold(sk_listener);
79 req->rsk_listener = sk_listener;
80 }
77 return req; 81 return req;
78} 82}
79 83
@@ -88,6 +92,8 @@ static inline void reqsk_free(struct request_sock *req)
88 WARN_ON_ONCE(atomic_read(&req->rsk_refcnt) != 0); 92 WARN_ON_ONCE(atomic_read(&req->rsk_refcnt) != 0);
89 93
90 req->rsk_ops->destructor(req); 94 req->rsk_ops->destructor(req);
95 if (req->rsk_listener)
96 sock_put(req->rsk_listener);
91 kmem_cache_free(req->rsk_ops->slab, req); 97 kmem_cache_free(req->rsk_ops->slab, req);
92} 98}
93 99
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 52b74e0eab2a..fbe518981d36 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -5970,7 +5970,7 @@ static void tcp_openreq_init(struct request_sock *req,
5970struct request_sock *inet_reqsk_alloc(const struct request_sock_ops *ops, 5970struct request_sock *inet_reqsk_alloc(const struct request_sock_ops *ops,
5971 struct sock *sk_listener) 5971 struct sock *sk_listener)
5972{ 5972{
5973 struct request_sock *req = reqsk_alloc(ops); 5973 struct request_sock *req = reqsk_alloc(ops, sk_listener);
5974 5974
5975 if (req) { 5975 if (req) {
5976 struct inet_request_sock *ireq = inet_rsk(req); 5976 struct inet_request_sock *ireq = inet_rsk(req);