On Thu, 2014-10-16 at 18:33 +0200, Rostislav Lisovy wrote: > You are right. I hope the following is a reasonable solution (in form of > a patch to my previous patch; comment stolen from some prehistoric > version of mesh.c): > > @@ -127,6 +127,9 @@ void ieee80211_ocb_work(struct ieee80211_sub_if_data *sdata) > struct ieee80211_if_ocb *ifocb = &sdata->u.ocb; > struct sta_info *sta; > > + if (!netif_running(sdata->dev)) > + return; Not sure, it seems you should check "is it operating in OCB mode"? OTOH, when it's not operating but still around it probably doesn't matter? > @@ -229,6 +232,13 @@ int ieee80211_ocb_leave(struct ieee80211_sub_if_data *sdata) > skb_queue_purge(&sdata->skb_queue); > > del_timer_sync(&sdata->u.ocb.housekeeping_timer); > + /* > + * If the timer fired while we waited for it, it will have > + * requeued the work. Now the work will be running again > + * but will not rearm the timer again because it checks > + * whether the interface is running, which, at this point, > + * it no longer is. > + */ Well, the comment is wrong, since leave() can and will be done while the interface is running. > > This isn't safe - ocb_rx_no_sta() used GFP_KERNEL, that's clearly not > > allowed in this context. But it does answer my previous question about > > the function being exported - I had assumed that you wouldn't call it > > here since it would be unsafe :) > > A call to sta_info_alloc(sdata, addr, GFP_ATOMIC); > in ieee80211_ocb_rx_no_sta() should solve this. Yeah, I guess so, didn't check in detail now. johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html