summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2014-03-11 13:28:42 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-06-25 00:49:19 -0700
commitf0490609a8495770d329b6b84fc446436bedf338 (patch)
tree9aa58ca244e4f5ccb44e36040f9f3502c7431372
parent6b3136f4fba7686acce49a10f145ab922a50baec (diff)
staging: ozwpan: handle race in remove binding
Make sure we remove node from list while we still hold lock. Bug 1474422 Change-Id: I7e23f6432f347937b1883ea086e55f5c324fc985 Reviewed-on: http://git-master/r/380497 (cherry picked from commit 466f6ed30787d16fff3f74e9412416de5b1eb0f6) Signed-off-by: Jean Huang <jeanh@nvidia.com> Reviewed-on: http://git-master/r/427950 GVS: Gerrit_Virtual_Submit
-rw-r--r--drivers/staging/ozwpan/ozproto.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c
index f0ac43283588..8cb25b285c6a 100644
--- a/drivers/staging/ozwpan/ozproto.c
+++ b/drivers/staging/ozwpan/ozproto.c
@@ -747,14 +747,15 @@ static void pd_stop_all_for_device(struct net_device *net_dev)
*/
void oz_binding_remove(const char *net_dev)
{
- struct oz_binding *binding;
+ struct oz_binding *binding, *tmp;
int found = 0;
oz_trace_msg(M, "Removing binding: '%s'\n", net_dev);
spin_lock_bh(&g_binding_lock);
- list_for_each_entry(binding, &g_binding, link) {
+ list_for_each_entry_safe(binding, tmp, &g_binding, link) {
if (compare_binding_name(binding->name, net_dev)) {
oz_trace_msg(M, "Binding '%s' found\n", net_dev);
+ list_del(&binding->link);
found = 1;
break;
}
@@ -767,7 +768,6 @@ void oz_binding_remove(const char *net_dev)
dev_put(binding->ptype.dev);
pd_stop_all_for_device(binding->ptype.dev);
}
- list_del(&binding->link);
kfree(binding);
}
}