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: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
Jeff Garzik
parent
bc63eb9c7e
commit
e4b91c4846
@@ -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
|
|||||||
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
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user