From 009e3cb326eb1d899ac778b4021572e4ee9f2473 Mon Sep 17 00:00:00 2001 From: Jason Wang Date: Fri, 11 Jan 2013 16:59:34 +0000 Subject: [PATCH] --- yaml --- r: 348632 b: refs/heads/master c: dd38bd853082355641d0034aaf368e13ef2438f8 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/tun.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 8840b80c74ab..31f498d05775 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7c0c3b1a8a175437991ccc898ed66ec5e4a96208 +refs/heads/master: dd38bd853082355641d0034aaf368e13ef2438f8 diff --git a/trunk/drivers/net/tun.c b/trunk/drivers/net/tun.c index a36b56f0940b..af372d0957fe 100644 --- a/trunk/drivers/net/tun.c +++ b/trunk/drivers/net/tun.c @@ -428,8 +428,10 @@ static void __tun_detach(struct tun_file *tfile, bool clean) /* Drop read queue */ skb_queue_purge(&tfile->sk.sk_receive_queue); tun_set_real_num_queues(tun); - } else if (tfile->detached && clean) + } else if (tfile->detached && clean) { tun = tun_enable_queue(tfile); + sock_put(&tfile->sk); + } if (clean) { if (tun && tun->numqueues == 0 && tun->numdisabled == 0 && @@ -478,6 +480,9 @@ static void tun_detach_all(struct net_device *dev) sock_put(&tfile->sk); } BUG_ON(tun->numdisabled != 0); + + if (tun->flags & TUN_PERSIST) + module_put(THIS_MODULE); } static int tun_attach(struct tun_struct *tun, struct file *file) @@ -1874,10 +1879,11 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, /* Disable/Enable persist mode. Keep an extra reference to the * module to prevent the module being unprobed. */ - if (arg) { + if (arg && !(tun->flags & TUN_PERSIST)) { tun->flags |= TUN_PERSIST; __module_get(THIS_MODULE); - } else { + } + if (!arg && (tun->flags & TUN_PERSIST)) { tun->flags &= ~TUN_PERSIST; module_put(THIS_MODULE); }