Skip to content

Commit

Permalink
caif: Fix race when conditionally taking rtnl lock
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
sjur.brandeland@stericsson.com authored and David S. Miller committed Jun 2, 2011
1 parent 85e3c65 commit 41be5a4
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions net/caif/chnl_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 41be5a4

Please sign in to comment.