aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/tun.c12
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
412static 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
412static void __tun_detach(struct tun_file *tfile, bool clean) 418static 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);