diff options
author | sjur.brandeland@stericsson.com <sjur.brandeland@stericsson.com> | 2011-06-01 04:55:37 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-06-02 08:13:53 +0400 |
commit | 41be5a4a3668810bf3687a76c2b017bd437039e0 (patch) | |
tree | dcdfd3de6ee34d6467f26208ae431f9207769088 /net/caif | |
parent | 85e3c65fa3a1d0542c181510a950a2be7733ff29 (diff) | |
download | linux-41be5a4a3668810bf3687a76c2b017bd437039e0.tar.xz |
caif: Fix race when conditionally taking rtnl lock
Take the RTNL lock unconditionally when calling dev_close.
Taking the lock conditionally may cause race conditions.
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/caif')
-rw-r--r-- | net/caif/chnl_net.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 649ebacaf6bc..adbb424403d4 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c @@ -139,17 +139,14 @@ static void close_work(struct work_struct *work) struct chnl_net *dev = NULL; struct list_head *list_node; struct list_head *_tmp; - /* May be called with or without RTNL lock held */ - int islocked = rtnl_is_locked(); - if (!islocked) - rtnl_lock(); + + rtnl_lock(); list_for_each_safe(list_node, _tmp, &chnl_net_list) { dev = list_entry(list_node, struct chnl_net, list_field); if (dev->state == CAIF_SHUTDOWN) dev_close(dev->netdev); } - if (!islocked) - rtnl_unlock(); + rtnl_unlock(); } static DECLARE_WORK(close_worker, close_work); |