#define rsk_refcnt                     __req_common.skc_refcnt
 
        struct request_sock             *dl_next;
+       struct sock                     *rsk_listener;
        u16                             mss;
        u8                              num_retrans; /* number of retransmits */
        u8                              cookie_ts:1; /* syncookie: encode tcpopts in timestamp */
        u32                             peer_secid;
 };
 
-static inline struct request_sock *reqsk_alloc(const struct request_sock_ops *ops)
+static inline struct request_sock *
+reqsk_alloc(const struct request_sock_ops *ops, struct sock *sk_listener)
 {
        struct request_sock *req = kmem_cache_alloc(ops->slab, GFP_ATOMIC);
 
-       if (req != NULL)
+       if (req) {
                req->rsk_ops = ops;
-
+               sock_hold(sk_listener);
+               req->rsk_listener = sk_listener;
+       }
        return req;
 }
 
        WARN_ON_ONCE(atomic_read(&req->rsk_refcnt) != 0);
 
        req->rsk_ops->destructor(req);
+       if (req->rsk_listener)
+               sock_put(req->rsk_listener);
        kmem_cache_free(req->rsk_ops->slab, req);
 }
 
 
 struct request_sock *inet_reqsk_alloc(const struct request_sock_ops *ops,
                                      struct sock *sk_listener)
 {
-       struct request_sock *req = reqsk_alloc(ops);
+       struct request_sock *req = reqsk_alloc(ops, sk_listener);
 
        if (req) {
                struct inet_request_sock *ireq = inet_rsk(req);