diff options
author | Mitch Williams <mitch.a.williams@intel.com> | 2005-11-09 13:36:41 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2005-11-13 14:48:21 -0500 |
commit | b76cdba9cdb29b091cacb4c11534ffb2eac02f64 (patch) | |
tree | a9125448834fd8daf6ae50bfa376d6a6ee697425 /drivers/net/bonding/bond_main.c | |
parent | 4756b02f558cbbbef5ae278fd3bbed778458c124 (diff) |
[PATCH] bonding: add sysfs functionality to bonding (large)
This large patch adds sysfs functionality to the channel bonding module.
Bonds can be added, removed, and reconfigured at runtime without having
to reload the module. Multiple bonds with different configurations are
easily configured, and ifenslave is no longer required to configure bonds.
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Acked-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index d5415ba9bdb0..5ac9718c5988 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -600,6 +600,7 @@ LIST_HEAD(bond_dev_list); | |||
600 | static struct proc_dir_entry *bond_proc_dir = NULL; | 600 | static struct proc_dir_entry *bond_proc_dir = NULL; |
601 | #endif | 601 | #endif |
602 | 602 | ||
603 | extern struct rw_semaphore bonding_rwsem; | ||
603 | static u32 arp_target[BOND_MAX_ARP_TARGETS] = { 0, } ; | 604 | static u32 arp_target[BOND_MAX_ARP_TARGETS] = { 0, } ; |
604 | static int arp_ip_count = 0; | 605 | static int arp_ip_count = 0; |
605 | static int bond_mode = BOND_MODE_ROUNDROBIN; | 606 | static int bond_mode = BOND_MODE_ROUNDROBIN; |
@@ -1960,6 +1961,10 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1960 | 1961 | ||
1961 | write_unlock_bh(&bond->lock); | 1962 | write_unlock_bh(&bond->lock); |
1962 | 1963 | ||
1964 | res = bond_create_slave_symlinks(bond_dev, slave_dev); | ||
1965 | if (res) | ||
1966 | goto err_unset_master; | ||
1967 | |||
1963 | printk(KERN_INFO DRV_NAME | 1968 | printk(KERN_INFO DRV_NAME |
1964 | ": %s: enslaving %s as a%s interface with a%s link.\n", | 1969 | ": %s: enslaving %s as a%s interface with a%s link.\n", |
1965 | bond_dev->name, slave_dev->name, | 1970 | bond_dev->name, slave_dev->name, |
@@ -2133,6 +2138,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) | |||
2133 | 2138 | ||
2134 | write_unlock_bh(&bond->lock); | 2139 | write_unlock_bh(&bond->lock); |
2135 | 2140 | ||
2141 | /* must do this from outside any spinlocks */ | ||
2142 | bond_destroy_slave_symlinks(bond_dev, slave_dev); | ||
2143 | |||
2136 | bond_del_vlans_from_slave(bond, slave_dev); | 2144 | bond_del_vlans_from_slave(bond, slave_dev); |
2137 | 2145 | ||
2138 | /* If the mode USES_PRIMARY, then we should only remove its | 2146 | /* If the mode USES_PRIMARY, then we should only remove its |
@@ -2224,6 +2232,7 @@ static int bond_release_all(struct net_device *bond_dev) | |||
2224 | */ | 2232 | */ |
2225 | write_unlock_bh(&bond->lock); | 2233 | write_unlock_bh(&bond->lock); |
2226 | 2234 | ||
2235 | bond_destroy_slave_symlinks(bond_dev, slave_dev); | ||
2227 | bond_del_vlans_from_slave(bond, slave_dev); | 2236 | bond_del_vlans_from_slave(bond, slave_dev); |
2228 | 2237 | ||
2229 | /* If the mode USES_PRIMARY, then we should only remove its | 2238 | /* If the mode USES_PRIMARY, then we should only remove its |
@@ -3518,7 +3527,10 @@ static int bond_event_changename(struct bonding *bond) | |||
3518 | bond_remove_proc_entry(bond); | 3527 | bond_remove_proc_entry(bond); |
3519 | bond_create_proc_entry(bond); | 3528 | bond_create_proc_entry(bond); |
3520 | #endif | 3529 | #endif |
3521 | 3530 | down_write(&(bonding_rwsem)); | |
3531 | bond_destroy_sysfs_entry(bond); | ||
3532 | bond_create_sysfs_entry(bond); | ||
3533 | up_write(&(bonding_rwsem)); | ||
3522 | return NOTIFY_DONE; | 3534 | return NOTIFY_DONE; |
3523 | } | 3535 | } |
3524 | 3536 | ||
@@ -3995,6 +4007,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd | |||
3995 | return -EPERM; | 4007 | return -EPERM; |
3996 | } | 4008 | } |
3997 | 4009 | ||
4010 | down_write(&(bonding_rwsem)); | ||
3998 | slave_dev = dev_get_by_name(ifr->ifr_slave); | 4011 | slave_dev = dev_get_by_name(ifr->ifr_slave); |
3999 | 4012 | ||
4000 | dprintk("slave_dev=%p: \n", slave_dev); | 4013 | dprintk("slave_dev=%p: \n", slave_dev); |
@@ -4027,6 +4040,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd | |||
4027 | dev_put(slave_dev); | 4040 | dev_put(slave_dev); |
4028 | } | 4041 | } |
4029 | 4042 | ||
4043 | up_write(&(bonding_rwsem)); | ||
4030 | return res; | 4044 | return res; |
4031 | } | 4045 | } |
4032 | 4046 | ||
@@ -4962,6 +4976,7 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
4962 | *newbond = bond_dev->priv; | 4976 | *newbond = bond_dev->priv; |
4963 | 4977 | ||
4964 | rtnl_unlock(); /* allows sysfs registration of net device */ | 4978 | rtnl_unlock(); /* allows sysfs registration of net device */ |
4979 | res = bond_create_sysfs_entry(bond_dev->priv); | ||
4965 | goto done; | 4980 | goto done; |
4966 | out_bond: | 4981 | out_bond: |
4967 | bond_deinit(bond_dev); | 4982 | bond_deinit(bond_dev); |
@@ -4996,6 +5011,10 @@ static int __init bonding_init(void) | |||
4996 | goto err; | 5011 | goto err; |
4997 | } | 5012 | } |
4998 | 5013 | ||
5014 | res = bond_create_sysfs(); | ||
5015 | if (res) | ||
5016 | goto err; | ||
5017 | |||
4999 | register_netdevice_notifier(&bond_netdev_notifier); | 5018 | register_netdevice_notifier(&bond_netdev_notifier); |
5000 | register_inetaddr_notifier(&bond_inetaddr_notifier); | 5019 | register_inetaddr_notifier(&bond_inetaddr_notifier); |
5001 | 5020 | ||
@@ -5003,6 +5022,7 @@ static int __init bonding_init(void) | |||
5003 | err: | 5022 | err: |
5004 | rtnl_lock(); | 5023 | rtnl_lock(); |
5005 | bond_free_all(); | 5024 | bond_free_all(); |
5025 | bond_destroy_sysfs(); | ||
5006 | rtnl_unlock(); | 5026 | rtnl_unlock(); |
5007 | out: | 5027 | out: |
5008 | return res; | 5028 | return res; |
@@ -5016,6 +5036,7 @@ static void __exit bonding_exit(void) | |||
5016 | 5036 | ||
5017 | rtnl_lock(); | 5037 | rtnl_lock(); |
5018 | bond_free_all(); | 5038 | bond_free_all(); |
5039 | bond_destroy_sysfs(); | ||
5019 | rtnl_unlock(); | 5040 | rtnl_unlock(); |
5020 | } | 5041 | } |
5021 | 5042 | ||