• Johannes Berg's avatar
    genetlink: fix netns vs. netlink table locking (2) · b8273570
    Johannes Berg authored
    Similar to commit d136f1bd,
    there's a bug when unregistering a generic netlink family,
    which is caught by the might_sleep() added in that commit:
    
        BUG: sleeping function called from invalid context at net/netlink/af_netlink.c:183
        in_atomic(): 1, irqs_disabled(): 0, pid: 1510, name: rmmod
        2 locks held by rmmod/1510:
         #0:  (genl_mutex){+.+.+.}, at: [<ffffffff8138283b>] genl_unregister_family+0x2b/0x130
         #1:  (rcu_read_lock){.+.+..}, at: [<ffffffff8138270c>] __genl_unregister_mc_group+0x1c/0x120
        Pid: 1510, comm: rmmod Not tainted 2.6.31-wl #444
        Call Trace:
         [<ffffffff81044ff9>] __might_sleep+0x119/0x150
         [<ffffffff81380501>] netlink_table_grab+0x21/0x100
         [<ffffffff813813a3>] netlink_clear_multicast_users+0x23/0x60
         [<ffffffff81382761>] __genl_unregister_mc_group+0x71/0x120
         [<ffffffff81382866>] genl_unregister_family+0x56/0x130
         [<ffffffffa0007d85>] nl80211_exit+0x15/0x20 [cfg80211]
         [<ffffffffa000005a>] cfg80211_exit+0x1a/0x40 [cfg80211]
    
    Fix in the same way by grabbing the netlink table lock
    before doing rcu_read_lock().
    Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b8273570
genetlink.c 21.4 KB