mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
85e3c65fa3
commit
41be5a4a36
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue