Specifies the number of bonding devices to create for this
        instance of the bonding driver.  E.g., if max_bonds is 3, and
        the bonding driver is not already loaded, then bond0, bond1
-       and bond2 will be created.  The default value is 1.
+       and bond2 will be created.  The default value is 1.  Specifying
+       a value of 0 will load bonding, but will not create any devices.
 
 miimon
 
 
                }
        }
 
-       if (max_bonds < 1 || max_bonds > INT_MAX) {
+       if (max_bonds < 0 || max_bonds > INT_MAX) {
                printk(KERN_WARNING DRV_NAME
                       ": Warning: max_bonds (%d) not in range %d-%d, so it "
                       "was reset to BOND_DEFAULT_MAX_BONDS (%d)\n",
-                      max_bonds, 1, INT_MAX, BOND_DEFAULT_MAX_BONDS);
+                      max_bonds, 0, INT_MAX, BOND_DEFAULT_MAX_BONDS);
                max_bonds = BOND_DEFAULT_MAX_BONDS;
        }
 
 
                printk("\n");
 
-       } else {
+       } else if (max_bonds) {
                /* miimon and arp_interval not set, we need one so things
                 * work as expected, see bonding.txt for details
                 */
 
 extern struct bond_parm_tbl fail_over_mac_tbl[];
 
 static int expected_refcount = -1;
-static struct class *netdev_class;
 /*--------------------------- Data Structures -----------------------------*/
 
 /* Bonding sysfs lock.  Why can't we just use the subsystem lock?
  */
 int bond_create_sysfs(void)
 {
-       int ret = 0;
-       struct bonding *firstbond;
-
-       /* get the netdev class pointer */
-       firstbond = container_of(bond_dev_list.next, struct bonding, bond_list);
-       if (!firstbond)
-               return -ENODEV;
-
-       netdev_class = firstbond->dev->dev.class;
-       if (!netdev_class)
-               return -ENODEV;
+       int ret;
 
-       ret = class_create_file(netdev_class, &class_attr_bonding_masters);
+       ret = netdev_class_create_file(&class_attr_bonding_masters);
        /*
         * Permit multiple loads of the module by ignoring failures to
         * create the bonding_masters sysfs file.  Bonding devices
                        printk(KERN_ERR
                               "network device named %s already exists in sysfs",
                               class_attr_bonding_masters.attr.name);
-               else {
-                       netdev_class = NULL;
-                       return 0;
-               }
        }
 
        return ret;
  */
 void bond_destroy_sysfs(void)
 {
-       if (netdev_class)
-               class_remove_file(netdev_class, &class_attr_bonding_masters);
+       netdev_class_remove_file(&class_attr_bonding_masters);
 }
 
 /*
 
 extern void dev_seq_stop(struct seq_file *seq, void *v);
 #endif
 
+extern int netdev_class_create_file(struct class_attribute *class_attr);
+extern void netdev_class_remove_file(struct class_attribute *class_attr);
+
 extern void linkwatch_run_queue(void);
 
 extern int netdev_compute_features(unsigned long all, unsigned long one);
 
        return device_add(dev);
 }
 
+int netdev_class_create_file(struct class_attribute *class_attr)
+{
+       return class_create_file(&net_class, class_attr);
+}
+
+void netdev_class_remove_file(struct class_attribute *class_attr)
+{
+       class_remove_file(&net_class, class_attr);
+}
+
+EXPORT_SYMBOL(netdev_class_create_file);
+EXPORT_SYMBOL(netdev_class_remove_file);
+
 void netdev_initialize_kobject(struct net_device *net)
 {
        struct device *device = &(net->dev);