diff options
author | Jay Vosburgh <fubar@us.ibm.com> | 2007-01-19 21:15:31 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-02-05 16:58:47 -0500 |
commit | e4b91c484611da385e34ff0f8bb2744ae2c735b7 (patch) | |
tree | 5887acc060adf2dfe900fdcc11127156ad6b6217 /drivers/net/bonding | |
parent | bc63eb9c7ec0eb7b091db2d82d46d1e68ff9e231 (diff) |
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>
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 6482aed4bb7c..07b9d1f65b66 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -4704,6 +4704,7 @@ static int bond_check_params(struct bond_params *params) | |||
4704 | static struct lock_class_key bonding_netdev_xmit_lock_key; | 4704 | static struct lock_class_key bonding_netdev_xmit_lock_key; |
4705 | 4705 | ||
4706 | /* Create a new bond based on the specified name and bonding parameters. | 4706 | /* Create a new bond based on the specified name and bonding parameters. |
4707 | * If name is NULL, obtain a suitable "bond%d" name for us. | ||
4707 | * Caller must NOT hold rtnl_lock; we need to release it here before we | 4708 | * Caller must NOT hold rtnl_lock; we need to release it here before we |
4708 | * set up our sysfs entries. | 4709 | * set up our sysfs entries. |
4709 | */ | 4710 | */ |
@@ -4713,7 +4714,8 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
4713 | int res; | 4714 | int res; |
4714 | 4715 | ||
4715 | rtnl_lock(); | 4716 | rtnl_lock(); |
4716 | bond_dev = alloc_netdev(sizeof(struct bonding), name, ether_setup); | 4717 | bond_dev = alloc_netdev(sizeof(struct bonding), name ? name : "", |
4718 | ether_setup); | ||
4717 | if (!bond_dev) { | 4719 | if (!bond_dev) { |
4718 | printk(KERN_ERR DRV_NAME | 4720 | printk(KERN_ERR DRV_NAME |
4719 | ": %s: eek! can't alloc netdev!\n", | 4721 | ": %s: eek! can't alloc netdev!\n", |
@@ -4722,6 +4724,12 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
4722 | goto out_rtnl; | 4724 | goto out_rtnl; |
4723 | } | 4725 | } |
4724 | 4726 | ||
4727 | if (!name) { | ||
4728 | res = dev_alloc_name(bond_dev, "bond%d"); | ||
4729 | if (res < 0) | ||
4730 | goto out_netdev; | ||
4731 | } | ||
4732 | |||
4725 | /* bond_init() must be called after dev_alloc_name() (for the | 4733 | /* bond_init() must be called after dev_alloc_name() (for the |
4726 | * /proc files), but before register_netdevice(), because we | 4734 | * /proc files), but before register_netdevice(), because we |
4727 | * need to set function pointers. | 4735 | * need to set function pointers. |
@@ -4763,7 +4771,6 @@ static int __init bonding_init(void) | |||
4763 | { | 4771 | { |
4764 | int i; | 4772 | int i; |
4765 | int res; | 4773 | int res; |
4766 | char new_bond_name[8]; /* Enough room for 999 bonds at init. */ | ||
4767 | 4774 | ||
4768 | printk(KERN_INFO "%s", version); | 4775 | printk(KERN_INFO "%s", version); |
4769 | 4776 | ||
@@ -4776,8 +4783,7 @@ static int __init bonding_init(void) | |||
4776 | bond_create_proc_dir(); | 4783 | bond_create_proc_dir(); |
4777 | #endif | 4784 | #endif |
4778 | for (i = 0; i < max_bonds; i++) { | 4785 | for (i = 0; i < max_bonds; i++) { |
4779 | sprintf(new_bond_name, "bond%d",i); | 4786 | res = bond_create(NULL, &bonding_defaults, NULL); |
4780 | res = bond_create(new_bond_name,&bonding_defaults, NULL); | ||
4781 | if (res) | 4787 | if (res) |
4782 | goto err; | 4788 | goto err; |
4783 | } | 4789 | } |