diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/tun.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 60a1e93e9d35..2dddb1bc82c9 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -409,6 +409,12 @@ static struct tun_struct *tun_enable_queue(struct tun_file *tfile) | |||
| 409 | return tun; | 409 | return tun; |
| 410 | } | 410 | } |
| 411 | 411 | ||
| 412 | static void tun_queue_purge(struct tun_file *tfile) | ||
| 413 | { | ||
| 414 | skb_queue_purge(&tfile->sk.sk_receive_queue); | ||
| 415 | skb_queue_purge(&tfile->sk.sk_error_queue); | ||
| 416 | } | ||
| 417 | |||
| 412 | static void __tun_detach(struct tun_file *tfile, bool clean) | 418 | static void __tun_detach(struct tun_file *tfile, bool clean) |
| 413 | { | 419 | { |
| 414 | struct tun_file *ntfile; | 420 | struct tun_file *ntfile; |
| @@ -435,7 +441,7 @@ static void __tun_detach(struct tun_file *tfile, bool clean) | |||
| 435 | synchronize_net(); | 441 | synchronize_net(); |
| 436 | tun_flow_delete_by_queue(tun, tun->numqueues + 1); | 442 | tun_flow_delete_by_queue(tun, tun->numqueues + 1); |
| 437 | /* Drop read queue */ | 443 | /* Drop read queue */ |
| 438 | skb_queue_purge(&tfile->sk.sk_receive_queue); | 444 | tun_queue_purge(tfile); |
| 439 | tun_set_real_num_queues(tun); | 445 | tun_set_real_num_queues(tun); |
| 440 | } else if (tfile->detached && clean) { | 446 | } else if (tfile->detached && clean) { |
| 441 | tun = tun_enable_queue(tfile); | 447 | tun = tun_enable_queue(tfile); |
| @@ -487,12 +493,12 @@ static void tun_detach_all(struct net_device *dev) | |||
| 487 | for (i = 0; i < n; i++) { | 493 | for (i = 0; i < n; i++) { |
| 488 | tfile = rtnl_dereference(tun->tfiles[i]); | 494 | tfile = rtnl_dereference(tun->tfiles[i]); |
| 489 | /* Drop read queue */ | 495 | /* Drop read queue */ |
| 490 | skb_queue_purge(&tfile->sk.sk_receive_queue); | 496 | tun_queue_purge(tfile); |
| 491 | sock_put(&tfile->sk); | 497 | sock_put(&tfile->sk); |
| 492 | } | 498 | } |
| 493 | list_for_each_entry_safe(tfile, tmp, &tun->disabled, next) { | 499 | list_for_each_entry_safe(tfile, tmp, &tun->disabled, next) { |
| 494 | tun_enable_queue(tfile); | 500 | tun_enable_queue(tfile); |
| 495 | skb_queue_purge(&tfile->sk.sk_receive_queue); | 501 | tun_queue_purge(tfile); |
| 496 | sock_put(&tfile->sk); | 502 | sock_put(&tfile->sk); |
| 497 | } | 503 | } |
| 498 | BUG_ON(tun->numdisabled != 0); | 504 | BUG_ON(tun->numdisabled != 0); |
