diff options
author | Sjur Brændeland <sjur.brandeland@stericsson.com> | 2011-04-11 10:11:29 +0000 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 15:15:10 +0200 |
commit | 09e10365574ce400accb81dc331e89e24c797694 (patch) | |
tree | 2cc6ea66f5e460513e32ded3e6b0e6a82ef4c6c1 /net | |
parent | dba941241f536e9969a42168032c024ac795d9ae (diff) |
caif: Bugfix use for_each_safe when removing list nodes.
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Change-Id: I7fec5eb6d17e01a87e89c2e7adec72d2f8babf83
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21520
Reviewed-by: Erwan BRACQ <erwan.bracq@stericsson.com>
Tested-by: Erwan BRACQ <erwan.bracq@stericsson.com>
Reviewed-by: QATEST
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/caif/cfmuxl.c | 22 |
1 files changed, 4 insertions, 18 deletions
diff --git a/net/caif/cfmuxl.c b/net/caif/cfmuxl.c index c23979e79df..5b17de51f64 100644 --- a/net/caif/cfmuxl.c +++ b/net/caif/cfmuxl.c @@ -247,25 +247,11 @@ static void cfmuxl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl, int phyid) { struct cfmuxl *muxl = container_obj(layr); + struct list_head *node, *next; struct cflayer *layer; - int idx; - - rcu_read_lock(); - list_for_each_entry_rcu(layer, &muxl->srvl_list, node) { - - if (cfsrvl_phyid_match(layer, phyid) && layer->ctrlcmd) { - - if ((ctrl == _CAIF_CTRLCMD_PHYIF_DOWN_IND || - ctrl == CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND) && - layer->id != 0) { - - idx = layer->id % UP_CACHE_SIZE; - spin_lock_bh(&muxl->receive_lock); - rcu_assign_pointer(muxl->up_cache[idx], NULL); - list_del_rcu(&layer->node); - spin_unlock_bh(&muxl->receive_lock); - } - /* NOTE: ctrlcmd is not allowed to block */ + list_for_each_safe(node, next, &muxl->srvl_list) { + layer = list_entry(node, struct cflayer, node); + if (cfsrvl_phyid_match(layer, phyid)) layer->ctrlcmd(layer, ctrl, phyid); } } |