提交 b76cdba9 编写于 作者: M Mitch Williams 提交者: John W. Linville

[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: NMitch Williams <mitch.a.williams@intel.com>
Acked-by: NJay Vosburgh <fubar@us.ibm.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 4756b02f
...@@ -4,5 +4,5 @@ ...@@ -4,5 +4,5 @@
obj-$(CONFIG_BONDING) += bonding.o obj-$(CONFIG_BONDING) += bonding.o
bonding-objs := bond_main.o bond_3ad.o bond_alb.o bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o
...@@ -600,6 +600,7 @@ LIST_HEAD(bond_dev_list); ...@@ -600,6 +600,7 @@ LIST_HEAD(bond_dev_list);
static struct proc_dir_entry *bond_proc_dir = NULL; static struct proc_dir_entry *bond_proc_dir = NULL;
#endif #endif
extern struct rw_semaphore bonding_rwsem;
static u32 arp_target[BOND_MAX_ARP_TARGETS] = { 0, } ; static u32 arp_target[BOND_MAX_ARP_TARGETS] = { 0, } ;
static int arp_ip_count = 0; static int arp_ip_count = 0;
static int bond_mode = BOND_MODE_ROUNDROBIN; 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,6 +1961,10 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
write_unlock_bh(&bond->lock); write_unlock_bh(&bond->lock);
res = bond_create_slave_symlinks(bond_dev, slave_dev);
if (res)
goto err_unset_master;
printk(KERN_INFO DRV_NAME printk(KERN_INFO DRV_NAME
": %s: enslaving %s as a%s interface with a%s link.\n", ": %s: enslaving %s as a%s interface with a%s link.\n",
bond_dev->name, slave_dev->name, bond_dev->name, slave_dev->name,
...@@ -2133,6 +2138,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) ...@@ -2133,6 +2138,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
write_unlock_bh(&bond->lock); write_unlock_bh(&bond->lock);
/* must do this from outside any spinlocks */
bond_destroy_slave_symlinks(bond_dev, slave_dev);
bond_del_vlans_from_slave(bond, slave_dev); bond_del_vlans_from_slave(bond, slave_dev);
/* If the mode USES_PRIMARY, then we should only remove its /* 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,6 +2232,7 @@ static int bond_release_all(struct net_device *bond_dev)
*/ */
write_unlock_bh(&bond->lock); write_unlock_bh(&bond->lock);
bond_destroy_slave_symlinks(bond_dev, slave_dev);
bond_del_vlans_from_slave(bond, slave_dev); bond_del_vlans_from_slave(bond, slave_dev);
/* If the mode USES_PRIMARY, then we should only remove its /* If the mode USES_PRIMARY, then we should only remove its
...@@ -3518,7 +3527,10 @@ static int bond_event_changename(struct bonding *bond) ...@@ -3518,7 +3527,10 @@ static int bond_event_changename(struct bonding *bond)
bond_remove_proc_entry(bond); bond_remove_proc_entry(bond);
bond_create_proc_entry(bond); bond_create_proc_entry(bond);
#endif #endif
down_write(&(bonding_rwsem));
bond_destroy_sysfs_entry(bond);
bond_create_sysfs_entry(bond);
up_write(&(bonding_rwsem));
return NOTIFY_DONE; return NOTIFY_DONE;
} }
...@@ -3995,6 +4007,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd ...@@ -3995,6 +4007,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
return -EPERM; return -EPERM;
} }
down_write(&(bonding_rwsem));
slave_dev = dev_get_by_name(ifr->ifr_slave); slave_dev = dev_get_by_name(ifr->ifr_slave);
dprintk("slave_dev=%p: \n", slave_dev); 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,6 +4040,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
dev_put(slave_dev); dev_put(slave_dev);
} }
up_write(&(bonding_rwsem));
return res; return res;
} }
...@@ -4962,6 +4976,7 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond ...@@ -4962,6 +4976,7 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond
*newbond = bond_dev->priv; *newbond = bond_dev->priv;
rtnl_unlock(); /* allows sysfs registration of net device */ rtnl_unlock(); /* allows sysfs registration of net device */
res = bond_create_sysfs_entry(bond_dev->priv);
goto done; goto done;
out_bond: out_bond:
bond_deinit(bond_dev); bond_deinit(bond_dev);
...@@ -4996,6 +5011,10 @@ static int __init bonding_init(void) ...@@ -4996,6 +5011,10 @@ static int __init bonding_init(void)
goto err; goto err;
} }
res = bond_create_sysfs();
if (res)
goto err;
register_netdevice_notifier(&bond_netdev_notifier); register_netdevice_notifier(&bond_netdev_notifier);
register_inetaddr_notifier(&bond_inetaddr_notifier); register_inetaddr_notifier(&bond_inetaddr_notifier);
...@@ -5003,6 +5022,7 @@ static int __init bonding_init(void) ...@@ -5003,6 +5022,7 @@ static int __init bonding_init(void)
err: err:
rtnl_lock(); rtnl_lock();
bond_free_all(); bond_free_all();
bond_destroy_sysfs();
rtnl_unlock(); rtnl_unlock();
out: out:
return res; return res;
...@@ -5016,6 +5036,7 @@ static void __exit bonding_exit(void) ...@@ -5016,6 +5036,7 @@ static void __exit bonding_exit(void)
rtnl_lock(); rtnl_lock();
bond_free_all(); bond_free_all();
bond_destroy_sysfs();
rtnl_unlock(); rtnl_unlock();
} }
......
此差异已折叠。
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/if_bonding.h> #include <linux/if_bonding.h>
#include <linux/kobject.h>
#include "bond_3ad.h" #include "bond_3ad.h"
#include "bond_alb.h" #include "bond_alb.h"
...@@ -262,6 +263,12 @@ struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr) ...@@ -262,6 +263,12 @@ struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr)
int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev); int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
int bond_create(char *name, struct bond_params *params, struct bonding **newbond); int bond_create(char *name, struct bond_params *params, struct bonding **newbond);
void bond_deinit(struct net_device *bond_dev); void bond_deinit(struct net_device *bond_dev);
int bond_create_sysfs(void);
void bond_destroy_sysfs(void);
void bond_destroy_sysfs_entry(struct bonding *bond);
int bond_create_sysfs_entry(struct bonding *bond);
int bond_create_slave_symlinks(struct net_device *master, struct net_device *slave);
void bond_destroy_slave_symlinks(struct net_device *master, struct net_device *slave);
int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev); int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册