diff options
Diffstat (limited to 'net/core/request_sock.c')
-rw-r--r-- | net/core/request_sock.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/net/core/request_sock.c b/net/core/request_sock.c index 87b22c0bc08c..b42f0e26f89e 100644 --- a/net/core/request_sock.c +++ b/net/core/request_sock.c | |||
@@ -103,10 +103,16 @@ void reqsk_queue_destroy(struct request_sock_queue *queue) | |||
103 | spin_lock_bh(&queue->syn_wait_lock); | 103 | spin_lock_bh(&queue->syn_wait_lock); |
104 | while ((req = lopt->syn_table[i]) != NULL) { | 104 | while ((req = lopt->syn_table[i]) != NULL) { |
105 | lopt->syn_table[i] = req->dl_next; | 105 | lopt->syn_table[i] = req->dl_next; |
106 | /* Because of following del_timer_sync(), | ||
107 | * we must release the spinlock here | ||
108 | * or risk a dead lock. | ||
109 | */ | ||
110 | spin_unlock_bh(&queue->syn_wait_lock); | ||
106 | atomic_inc(&lopt->qlen_dec); | 111 | atomic_inc(&lopt->qlen_dec); |
107 | if (del_timer(&req->rsk_timer)) | 112 | if (del_timer_sync(&req->rsk_timer)) |
108 | reqsk_put(req); | 113 | reqsk_put(req); |
109 | reqsk_put(req); | 114 | reqsk_put(req); |
115 | spin_lock_bh(&queue->syn_wait_lock); | ||
110 | } | 116 | } |
111 | spin_unlock_bh(&queue->syn_wait_lock); | 117 | spin_unlock_bh(&queue->syn_wait_lock); |
112 | } | 118 | } |