diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/request_sock.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/net/core/request_sock.c b/net/core/request_sock.c index 5f0818d815e6..45aed75cb571 100644 --- a/net/core/request_sock.c +++ b/net/core/request_sock.c | |||
@@ -71,6 +71,41 @@ int reqsk_queue_alloc(struct request_sock_queue *queue, | |||
71 | 71 | ||
72 | EXPORT_SYMBOL(reqsk_queue_alloc); | 72 | EXPORT_SYMBOL(reqsk_queue_alloc); |
73 | 73 | ||
74 | void __reqsk_queue_destroy(struct request_sock_queue *queue) | ||
75 | { | ||
76 | struct listen_sock *lopt; | ||
77 | size_t lopt_size; | ||
78 | |||
79 | /* | ||
80 | * this is an error recovery path only | ||
81 | * no locking needed and the lopt is not NULL | ||
82 | */ | ||
83 | |||
84 | lopt = queue->listen_opt; | ||
85 | lopt_size = sizeof(struct listen_sock) + | ||
86 | lopt->nr_table_entries * sizeof(struct request_sock *); | ||
87 | |||
88 | if (lopt_size > PAGE_SIZE) | ||
89 | vfree(lopt); | ||
90 | else | ||
91 | kfree(lopt); | ||
92 | } | ||
93 | |||
94 | EXPORT_SYMBOL(__reqsk_queue_destroy); | ||
95 | |||
96 | static inline struct listen_sock *reqsk_queue_yank_listen_sk( | ||
97 | struct request_sock_queue *queue) | ||
98 | { | ||
99 | struct listen_sock *lopt; | ||
100 | |||
101 | write_lock_bh(&queue->syn_wait_lock); | ||
102 | lopt = queue->listen_opt; | ||
103 | queue->listen_opt = NULL; | ||
104 | write_unlock_bh(&queue->syn_wait_lock); | ||
105 | |||
106 | return lopt; | ||
107 | } | ||
108 | |||
74 | void reqsk_queue_destroy(struct request_sock_queue *queue) | 109 | void reqsk_queue_destroy(struct request_sock_queue *queue) |
75 | { | 110 | { |
76 | /* make all the listen_opt local to us */ | 111 | /* make all the listen_opt local to us */ |