• Tony Battersby's avatar
    bonding: fix oops during rmmod · a45835a0
    Tony Battersby authored
    "rmmod bonding" causes an oops ever since commit cc317ea3 ("bonding:
    remove redundant NULL check in debugfs function").  Here are the relevant
    functions being called:
    
    bonding_exit()
      bond_destroy_debugfs()
        debugfs_remove_recursive(bonding_debug_root);
        bonding_debug_root = NULL; <--------- SET TO NULL HERE
      bond_netlink_fini()
        rtnl_link_unregister()
          __rtnl_link_unregister()
            unregister_netdevice_many_notify()
              bond_uninit()
                bond_debug_unregister()
                  (commit removed check for bonding_debug_root == NULL)
                  debugfs_remove()
                  simple_recursive_removal()
                    down_write() -> OOPS
    
    However, reverting the bad commit does not solve the problem completely
    because the original code contains a race that could cause the same
    oops, although it was much less likely to be triggered unintentionally:
    
    CPU1
      rmmod bonding
        bonding_exit()
          bond_destroy_debugfs()
            debugfs_remove_recursive(bonding_debug_root);
    
    CPU2
      echo -bond0 > /sys/class/net/bonding_masters
        bond_uninit()
          bond_debug_unregister()
            if (!bonding_debug_root)
    
    CPU1
            bonding_debug_root = NULL;
    
    So do NOT revert the bad commit (since the removed checks were racy
    anyway), and instead change the order of actions taken during module
    removal.  The same oops can also happen if there is an error during
    module init, so apply the same fix there.
    
    Fixes: cc317ea3 ("bonding: remove redundant NULL check in debugfs function")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarTony Battersby <tonyb@cybernetics.com>
    Reviewed-by: default avatarSimon Horman <horms@kernel.org>
    Acked-by: default avatarJay Vosburgh <jay.vosburgh@canonical.com>
    Link: https://lore.kernel.org/r/641f914f-3216-4eeb-87dd-91b78aa97773@cybernetics.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    a45835a0
bond_main.c 177 KB