Commit e4b91c48 authored by Jay Vosburgh's avatar Jay Vosburgh Committed by Jeff Garzik

bonding: fix device name allocation error

	The code to select names for the bonding interfaces was, for the
non-sysfs creation case, always using a hard-coded set of bond0, bond1,
etc, up to max_bonds.  This caused conflicts for the second or
subsequent loads of the module.

	Changed the code to obtain device names from dev_alloc_name().
Signed-off-by: default avatarJay Vosburgh <fubar@us.ibm.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent bc63eb9c
...@@ -4704,6 +4704,7 @@ static int bond_check_params(struct bond_params *params) ...@@ -4704,6 +4704,7 @@ static int bond_check_params(struct bond_params *params)
static struct lock_class_key bonding_netdev_xmit_lock_key; static struct lock_class_key bonding_netdev_xmit_lock_key;
/* Create a new bond based on the specified name and bonding parameters. /* Create a new bond based on the specified name and bonding parameters.
* If name is NULL, obtain a suitable "bond%d" name for us.
* Caller must NOT hold rtnl_lock; we need to release it here before we * Caller must NOT hold rtnl_lock; we need to release it here before we
* set up our sysfs entries. * set up our sysfs entries.
*/ */
...@@ -4713,7 +4714,8 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond ...@@ -4713,7 +4714,8 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond
int res; int res;
rtnl_lock(); rtnl_lock();
bond_dev = alloc_netdev(sizeof(struct bonding), name, ether_setup); bond_dev = alloc_netdev(sizeof(struct bonding), name ? name : "",
ether_setup);
if (!bond_dev) { if (!bond_dev) {
printk(KERN_ERR DRV_NAME printk(KERN_ERR DRV_NAME
": %s: eek! can't alloc netdev!\n", ": %s: eek! can't alloc netdev!\n",
...@@ -4722,6 +4724,12 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond ...@@ -4722,6 +4724,12 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond
goto out_rtnl; goto out_rtnl;
} }
if (!name) {
res = dev_alloc_name(bond_dev, "bond%d");
if (res < 0)
goto out_netdev;
}
/* bond_init() must be called after dev_alloc_name() (for the /* bond_init() must be called after dev_alloc_name() (for the
* /proc files), but before register_netdevice(), because we * /proc files), but before register_netdevice(), because we
* need to set function pointers. * need to set function pointers.
...@@ -4763,7 +4771,6 @@ static int __init bonding_init(void) ...@@ -4763,7 +4771,6 @@ static int __init bonding_init(void)
{ {
int i; int i;
int res; int res;
char new_bond_name[8]; /* Enough room for 999 bonds at init. */
printk(KERN_INFO "%s", version); printk(KERN_INFO "%s", version);
...@@ -4776,8 +4783,7 @@ static int __init bonding_init(void) ...@@ -4776,8 +4783,7 @@ static int __init bonding_init(void)
bond_create_proc_dir(); bond_create_proc_dir();
#endif #endif
for (i = 0; i < max_bonds; i++) { for (i = 0; i < max_bonds; i++) {
sprintf(new_bond_name, "bond%d",i); res = bond_create(NULL, &bonding_defaults, NULL);
res = bond_create(new_bond_name,&bonding_defaults, NULL);
if (res) if (res)
goto err; goto err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment