X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=net%2Fcore%2Frequest_sock.c;h=2d3035d3abd7a923eef8849f0b31590ee418bdd4;hb=a4e0d9af403d099e751797f6cc69e4a8e2d78ef1;hp=5f0818d815e6b700408f2dcea1986b87fdc09645;hpb=1c1afa3c053d4ccdf44e5a4e159005cdfd48bfc6;p=linux-2.6 diff --git a/net/core/request_sock.c b/net/core/request_sock.c index 5f0818d815..2d3035d3ab 100644 --- a/net/core/request_sock.c +++ b/net/core/request_sock.c @@ -69,7 +69,38 @@ int reqsk_queue_alloc(struct request_sock_queue *queue, return 0; } -EXPORT_SYMBOL(reqsk_queue_alloc); +void __reqsk_queue_destroy(struct request_sock_queue *queue) +{ + struct listen_sock *lopt; + size_t lopt_size; + + /* + * this is an error recovery path only + * no locking needed and the lopt is not NULL + */ + + lopt = queue->listen_opt; + lopt_size = sizeof(struct listen_sock) + + lopt->nr_table_entries * sizeof(struct request_sock *); + + if (lopt_size > PAGE_SIZE) + vfree(lopt); + else + kfree(lopt); +} + +static inline struct listen_sock *reqsk_queue_yank_listen_sk( + struct request_sock_queue *queue) +{ + struct listen_sock *lopt; + + write_lock_bh(&queue->syn_wait_lock); + lopt = queue->listen_opt; + queue->listen_opt = NULL; + write_unlock_bh(&queue->syn_wait_lock); + + return lopt; +} void reqsk_queue_destroy(struct request_sock_queue *queue) { @@ -99,4 +130,3 @@ void reqsk_queue_destroy(struct request_sock_queue *queue) kfree(lopt); } -EXPORT_SYMBOL(reqsk_queue_destroy);