diff options
author | sjur.brandeland@stericsson.com <sjur.brandeland@stericsson.com> | 2011-06-01 02:55:37 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-06-02 06:13:53 +0200 |
commit | 41be5a4a3668810bf3687a76c2b017bd437039e0 (patch) | |
tree | dcdfd3de6ee34d6467f26208ae431f9207769088 | |
parent | usbnet/cdc_ncm: add missing .reset_resume hook (diff) | |
download | linux-41be5a4a3668810bf3687a76c2b017bd437039e0.tar.xz linux-41be5a4a3668810bf3687a76c2b017bd437039e0.zip |
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>
-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); |