|
@@ -1979,6 +1979,20 @@ void bond_destroy(struct bonding *bond)
|
|
|
unregister_netdevice(bond->dev);
|
|
|
}
|
|
|
|
|
|
+static void bond_destructor(struct net_device *bond_dev)
|
|
|
+{
|
|
|
+ struct bonding *bond = bond_dev->priv;
|
|
|
+
|
|
|
+ if (bond->wq)
|
|
|
+ destroy_workqueue(bond->wq);
|
|
|
+
|
|
|
+ netif_addr_lock_bh(bond_dev);
|
|
|
+ bond_mc_list_destroy(bond);
|
|
|
+ netif_addr_unlock_bh(bond_dev);
|
|
|
+
|
|
|
+ free_netdev(bond_dev);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* First release a slave and than destroy the bond if no more slaves iare left.
|
|
|
* Must be under rtnl_lock when this function is called.
|
|
@@ -2376,6 +2390,9 @@ static void bond_miimon_commit(struct bonding *bond)
|
|
|
continue;
|
|
|
|
|
|
case BOND_LINK_DOWN:
|
|
|
+ if (slave->link_failure_count < UINT_MAX)
|
|
|
+ slave->link_failure_count++;
|
|
|
+
|
|
|
slave->link = BOND_LINK_DOWN;
|
|
|
|
|
|
if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
|
|
@@ -4550,7 +4567,7 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
|
|
|
|
|
|
bond_set_mode_ops(bond, bond->params.mode);
|
|
|
|
|
|
- bond_dev->destructor = free_netdev;
|
|
|
+ bond_dev->destructor = bond_destructor;
|
|
|
|
|
|
/* Initialize the device options */
|
|
|
bond_dev->tx_queue_len = 0;
|
|
@@ -4589,20 +4606,6 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/* De-initialize device specific data.
|
|
|
- * Caller must hold rtnl_lock.
|
|
|
- */
|
|
|
-static void bond_deinit(struct net_device *bond_dev)
|
|
|
-{
|
|
|
- struct bonding *bond = bond_dev->priv;
|
|
|
-
|
|
|
- list_del(&bond->bond_list);
|
|
|
-
|
|
|
-#ifdef CONFIG_PROC_FS
|
|
|
- bond_remove_proc_entry(bond);
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
static void bond_work_cancel_all(struct bonding *bond)
|
|
|
{
|
|
|
write_lock_bh(&bond->lock);
|
|
@@ -4624,6 +4627,22 @@ static void bond_work_cancel_all(struct bonding *bond)
|
|
|
cancel_delayed_work(&bond->ad_work);
|
|
|
}
|
|
|
|
|
|
+/* De-initialize device specific data.
|
|
|
+ * Caller must hold rtnl_lock.
|
|
|
+ */
|
|
|
+static void bond_deinit(struct net_device *bond_dev)
|
|
|
+{
|
|
|
+ struct bonding *bond = bond_dev->priv;
|
|
|
+
|
|
|
+ list_del(&bond->bond_list);
|
|
|
+
|
|
|
+ bond_work_cancel_all(bond);
|
|
|
+
|
|
|
+#ifdef CONFIG_PROC_FS
|
|
|
+ bond_remove_proc_entry(bond);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/* Unregister and free all bond devices.
|
|
|
* Caller must hold rtnl_lock.
|
|
|
*/
|
|
@@ -4635,9 +4654,6 @@ static void bond_free_all(void)
|
|
|
struct net_device *bond_dev = bond->dev;
|
|
|
|
|
|
bond_work_cancel_all(bond);
|
|
|
- netif_addr_lock_bh(bond_dev);
|
|
|
- bond_mc_list_destroy(bond);
|
|
|
- netif_addr_unlock_bh(bond_dev);
|
|
|
/* Release the bonded slaves */
|
|
|
bond_release_all(bond_dev);
|
|
|
bond_destroy(bond);
|