Commit 41be5a4a authored by sjur.brandeland@stericsson.com's avatar sjur.brandeland@stericsson.com Committed by David S. Miller

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: default avatarSjur Brændeland <sjur.brandeland@stericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 85e3c65f
...@@ -139,17 +139,14 @@ static void close_work(struct work_struct *work) ...@@ -139,17 +139,14 @@ static void close_work(struct work_struct *work)
struct chnl_net *dev = NULL; struct chnl_net *dev = NULL;
struct list_head *list_node; struct list_head *list_node;
struct list_head *_tmp; struct list_head *_tmp;
/* May be called with or without RTNL lock held */
int islocked = rtnl_is_locked(); rtnl_lock();
if (!islocked)
rtnl_lock();
list_for_each_safe(list_node, _tmp, &chnl_net_list) { list_for_each_safe(list_node, _tmp, &chnl_net_list) {
dev = list_entry(list_node, struct chnl_net, list_field); dev = list_entry(list_node, struct chnl_net, list_field);
if (dev->state == CAIF_SHUTDOWN) if (dev->state == CAIF_SHUTDOWN)
dev_close(dev->netdev); dev_close(dev->netdev);
} }
if (!islocked) rtnl_unlock();
rtnl_unlock();
} }
static DECLARE_WORK(close_worker, close_work); static DECLARE_WORK(close_worker, close_work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment