diff options
author | Vinayak Pane <vpane@nvidia.com> | 2014-03-11 13:28:42 -0700 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-06-25 00:49:19 -0700 |
commit | f0490609a8495770d329b6b84fc446436bedf338 (patch) | |
tree | 9aa58ca244e4f5ccb44e36040f9f3502c7431372 | |
parent | 6b3136f4fba7686acce49a10f145ab922a50baec (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.c | 6 |
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); } } |