diff options
Diffstat (limited to 'net/unix/garbage.c')
-rw-r--r-- | net/unix/garbage.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 6a0d48525fcf..c36757e72844 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c | |||
@@ -146,6 +146,7 @@ void unix_notinflight(struct user_struct *user, struct file *fp) | |||
146 | if (s) { | 146 | if (s) { |
147 | struct unix_sock *u = unix_sk(s); | 147 | struct unix_sock *u = unix_sk(s); |
148 | 148 | ||
149 | BUG_ON(!atomic_long_read(&u->inflight)); | ||
149 | BUG_ON(list_empty(&u->link)); | 150 | BUG_ON(list_empty(&u->link)); |
150 | 151 | ||
151 | if (atomic_long_dec_and_test(&u->inflight)) | 152 | if (atomic_long_dec_and_test(&u->inflight)) |
@@ -341,6 +342,14 @@ void unix_gc(void) | |||
341 | } | 342 | } |
342 | list_del(&cursor); | 343 | list_del(&cursor); |
343 | 344 | ||
345 | /* Now gc_candidates contains only garbage. Restore original | ||
346 | * inflight counters for these as well, and remove the skbuffs | ||
347 | * which are creating the cycle(s). | ||
348 | */ | ||
349 | skb_queue_head_init(&hitlist); | ||
350 | list_for_each_entry(u, &gc_candidates, link) | ||
351 | scan_children(&u->sk, inc_inflight, &hitlist); | ||
352 | |||
344 | /* not_cycle_list contains those sockets which do not make up a | 353 | /* not_cycle_list contains those sockets which do not make up a |
345 | * cycle. Restore these to the inflight list. | 354 | * cycle. Restore these to the inflight list. |
346 | */ | 355 | */ |
@@ -350,14 +359,6 @@ void unix_gc(void) | |||
350 | list_move_tail(&u->link, &gc_inflight_list); | 359 | list_move_tail(&u->link, &gc_inflight_list); |
351 | } | 360 | } |
352 | 361 | ||
353 | /* Now gc_candidates contains only garbage. Restore original | ||
354 | * inflight counters for these as well, and remove the skbuffs | ||
355 | * which are creating the cycle(s). | ||
356 | */ | ||
357 | skb_queue_head_init(&hitlist); | ||
358 | list_for_each_entry(u, &gc_candidates, link) | ||
359 | scan_children(&u->sk, inc_inflight, &hitlist); | ||
360 | |||
361 | spin_unlock(&unix_gc_lock); | 362 | spin_unlock(&unix_gc_lock); |
362 | 363 | ||
363 | /* Here we are. Hitlist is filled. Die. */ | 364 | /* Here we are. Hitlist is filled. Die. */ |