X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=net%2Fcore%2Frequest_sock.c;h=2d3035d3abd7a923eef8849f0b31590ee418bdd4;hb=6712e299b7dc78aa4971b85e803435ee6d49a9dd;hp=5f0818d815e6b700408f2dcea1986b87fdc09645;hpb=79acbb3ff2d8095b692e1502b9eb2ccec348de26;p=linux-2.6-omap-h63xx.git diff --git a/net/core/request_sock.c b/net/core/request_sock.c index 5f0818d815e..2d3035d3abd 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);