summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorHemant Ramdasi <hemant.ramdasi@stericsson.com>2011-09-07 16:24:08 +0530
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 16:07:24 +0200
commit79a52de74a497765b02b669c71f94a1a3af9a99b (patch)
tree8fc750110bba3f3fba3abbd1f63ce57a0f36b677 /net
parent7f6175fd33162ac9ec4ef81cecdb47580f629473 (diff)
Revert "caif: Bugfix use for_each_safe when removing list nodes."
This reverts commit 8b7b286d853032b485de9753c3908c300266c660. Refer 0c184ed9032c58b21f0d90de28c796874b73d6a1 for original commit. Signed-off-by: Hemant Ramdasi <hemant.ramdasi@stericsson.com> Change-Id: Iaa8c88ed05d24bdfb3c7b505cc1342c088cdfd51 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/30328
Diffstat (limited to 'net')
-rw-r--r--net/caif/cfmuxl.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/net/caif/cfmuxl.c b/net/caif/cfmuxl.c
index 5b17de51f64..c23979e79df 100644
--- a/net/caif/cfmuxl.c
+++ b/net/caif/cfmuxl.c
@@ -247,11 +247,25 @@ 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;
- list_for_each_safe(node, next, &muxl->srvl_list) {
- layer = list_entry(node, struct cflayer, node);
- if (cfsrvl_phyid_match(layer, phyid))
+ 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 */
layer->ctrlcmd(layer, ctrl, phyid);
}
}