• Johannes Berg's avatar
    mac80211: fix IBSS lockdep complaint · bc05d19f
    Johannes Berg authored
    Bob reported a lockdep complaint originating in
    the mac80211 IBSS code due to the common work
    struct patch. The reason is that the IBSS and
    station mode code have different locking orders
    for the cfg80211 wdev lock and the work struct
    (where "locking" implies running/canceling).
    
    Fix this by simply not canceling the work in
    the IBSS code, it is not necessary since when
    the REQ_RUN bit is cleared, the work will run
    without effect if it runs. When the interface
    is set down, it is flushed anyway, so there's
    no concern about it running after memory has
    been invalidated either.
    
    This fixes
    https://bugzilla.kernel.org/show_bug.cgi?id=16419
    
    Additionally, looking into this I noticed that
    there's a small window while the IBSS is torn
    down in which the work may be rescheduled and
    the REQ_RUN bit be set again after leave() has
    cleared it when a scan finishes at exactly the
    same time. Avoid that by setting the ssid_len
    to zero before clearing REQ_RUN which signals
    to the scan finish code that this interface is
    not active.
    Reported-by: default avatarBob Copeland <me@bobcopeland.com>
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    bc05d19f
ibss.c 26.5 KB