diff options
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 23b832ffe7a9..2fc3561e099d 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1972,25 +1972,19 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1972 | * Destroy a bonding device. | 1972 | * Destroy a bonding device. |
1973 | * Must be under rtnl_lock when this function is called. | 1973 | * Must be under rtnl_lock when this function is called. |
1974 | */ | 1974 | */ |
1975 | void bond_destroy(struct bonding *bond) | 1975 | static void bond_uninit(struct net_device *bond_dev) |
1976 | { | ||
1977 | bond_deinit(bond->dev); | ||
1978 | bond_destroy_sysfs_entry(bond); | ||
1979 | unregister_netdevice(bond->dev); | ||
1980 | } | ||
1981 | |||
1982 | static void bond_destructor(struct net_device *bond_dev) | ||
1983 | { | 1976 | { |
1984 | struct bonding *bond = netdev_priv(bond_dev); | 1977 | struct bonding *bond = netdev_priv(bond_dev); |
1985 | 1978 | ||
1979 | bond_deinit(bond_dev); | ||
1980 | bond_destroy_sysfs_entry(bond); | ||
1981 | |||
1986 | if (bond->wq) | 1982 | if (bond->wq) |
1987 | destroy_workqueue(bond->wq); | 1983 | destroy_workqueue(bond->wq); |
1988 | 1984 | ||
1989 | netif_addr_lock_bh(bond_dev); | 1985 | netif_addr_lock_bh(bond_dev); |
1990 | bond_mc_list_destroy(bond); | 1986 | bond_mc_list_destroy(bond); |
1991 | netif_addr_unlock_bh(bond_dev); | 1987 | netif_addr_unlock_bh(bond_dev); |
1992 | |||
1993 | free_netdev(bond_dev); | ||
1994 | } | 1988 | } |
1995 | 1989 | ||
1996 | /* | 1990 | /* |
@@ -2006,7 +2000,7 @@ int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *sl | |||
2006 | if ((ret == 0) && (bond->slave_cnt == 0)) { | 2000 | if ((ret == 0) && (bond->slave_cnt == 0)) { |
2007 | printk(KERN_INFO DRV_NAME ": %s: destroying bond %s.\n", | 2001 | printk(KERN_INFO DRV_NAME ": %s: destroying bond %s.\n", |
2008 | bond_dev->name, bond_dev->name); | 2002 | bond_dev->name, bond_dev->name); |
2009 | bond_destroy(bond); | 2003 | unregister_netdevice(bond_dev); |
2010 | } | 2004 | } |
2011 | return ret; | 2005 | return ret; |
2012 | } | 2006 | } |
@@ -4572,6 +4566,7 @@ static const struct ethtool_ops bond_ethtool_ops = { | |||
4572 | }; | 4566 | }; |
4573 | 4567 | ||
4574 | static const struct net_device_ops bond_netdev_ops = { | 4568 | static const struct net_device_ops bond_netdev_ops = { |
4569 | .ndo_uninit = bond_uninit, | ||
4575 | .ndo_open = bond_open, | 4570 | .ndo_open = bond_open, |
4576 | .ndo_stop = bond_close, | 4571 | .ndo_stop = bond_close, |
4577 | .ndo_start_xmit = bond_start_xmit, | 4572 | .ndo_start_xmit = bond_start_xmit, |
@@ -4622,7 +4617,7 @@ static int bond_init(struct net_device *bond_dev) | |||
4622 | bond_dev->ethtool_ops = &bond_ethtool_ops; | 4617 | bond_dev->ethtool_ops = &bond_ethtool_ops; |
4623 | bond_set_mode_ops(bond, bond->params.mode); | 4618 | bond_set_mode_ops(bond, bond->params.mode); |
4624 | 4619 | ||
4625 | bond_dev->destructor = bond_destructor; | 4620 | bond_dev->destructor = free_netdev; |
4626 | 4621 | ||
4627 | /* Initialize the device options */ | 4622 | /* Initialize the device options */ |
4628 | bond_dev->tx_queue_len = 0; | 4623 | bond_dev->tx_queue_len = 0; |
@@ -4706,7 +4701,7 @@ static void bond_free_all(void) | |||
4706 | bond_work_cancel_all(bond); | 4701 | bond_work_cancel_all(bond); |
4707 | /* Release the bonded slaves */ | 4702 | /* Release the bonded slaves */ |
4708 | bond_release_all(bond_dev); | 4703 | bond_release_all(bond_dev); |
4709 | bond_destroy(bond); | 4704 | unregister_netdevice(bond_dev); |
4710 | } | 4705 | } |
4711 | 4706 | ||
4712 | bond_destroy_proc_dir(); | 4707 | bond_destroy_proc_dir(); |