--- /dev/null
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/netdevice.h>
+
+#include "bonding.h"
+
+#ifdef CONFIG_DEBUG_FS
+
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+
+static struct dentry *bonding_debug_root;
+
+void bond_debug_register(struct bonding *bond)
+{
+       if (!bonding_debug_root)
+               return;
+
+       bond->debug_dir =
+               debugfs_create_dir(bond->dev->name, bonding_debug_root);
+
+       if (!bond->debug_dir) {
+               pr_warning("%s: Warning: failed to register to debugfs\n",
+                       bond->dev->name);
+               return;
+       }
+}
+
+void bond_debug_unregister(struct bonding *bond)
+{
+       if (!bonding_debug_root)
+               return;
+
+       debugfs_remove_recursive(bond->debug_dir);
+}
+
+void bond_debug_reregister(struct bonding *bond)
+{
+       struct dentry *d;
+
+       if (!bonding_debug_root)
+               return;
+
+       d = debugfs_rename(bonding_debug_root, bond->debug_dir,
+                          bonding_debug_root, bond->dev->name);
+       if (d) {
+               bond->debug_dir = d;
+       } else {
+               pr_warning("%s: Warning: failed to reregister, "
+                               "so just unregister old one\n",
+                               bond->dev->name);
+               bond_debug_unregister(bond);
+       }
+}
+
+void bond_create_debugfs(void)
+{
+       bonding_debug_root = debugfs_create_dir("bonding", NULL);
+
+       if (!bonding_debug_root) {
+               pr_warning("Warning: Cannot create bonding directory"
+                               " in debugfs\n");
+       }
+}
+
+void bond_destroy_debugfs(void)
+{
+       debugfs_remove_recursive(bonding_debug_root);
+       bonding_debug_root = NULL;
+}
+
+
+#else /* !CONFIG_DEBUG_FS */
+
+void bond_debug_register(struct bonding *bond)
+{
+}
+
+void bond_debug_unregister(struct bonding *bond)
+{
+}
+
+void bond_debug_reregister(struct bonding *bond)
+{
+}
+
+void bond_create_debugfs(void)
+{
+}
+
+void bond_destroy_debugfs(void)
+{
+}
+
+#endif /* CONFIG_DEBUG_FS */
 
        bond_remove_proc_entry(bond);
        bond_create_proc_entry(bond);
 
+       bond_debug_reregister(bond);
+
        return NOTIFY_DONE;
 }
 
 
        bond_remove_proc_entry(bond);
 
+       bond_debug_unregister(bond);
+
        __hw_addr_flush(&bond->mc_list);
 
        list_for_each_entry_safe(vlan, tmp, &bond->vlan_list, vlan_list) {
 
        bond_prepare_sysfs_group(bond);
 
+       bond_debug_register(bond);
+
        __hw_addr_init(&bond->mc_list);
        return 0;
 }
        if (res)
                goto err_link;
 
+       bond_create_debugfs();
+
        for (i = 0; i < max_bonds; i++) {
                res = bond_create(&init_net, NULL);
                if (res)
        if (res)
                goto err;
 
-
        register_netdevice_notifier(&bond_netdev_notifier);
        register_inetaddr_notifier(&bond_inetaddr_notifier);
        bond_register_ipv6_notifier();
        bond_unregister_ipv6_notifier();
 
        bond_destroy_sysfs();
+       bond_destroy_debugfs();
 
        rtnl_link_unregister(&bond_link_ops);
        unregister_pernet_subsys(&bond_net_ops);
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        struct   in6_addr master_ipv6;
 #endif
+#ifdef CONFIG_DEBUG_FS
+       /* debugging suport via debugfs */
+       struct   dentry *debug_dir;
+#endif /* CONFIG_DEBUG_FS */
 };
 
 /**
 void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
 void bond_register_arp(struct bonding *);
 void bond_unregister_arp(struct bonding *);
+void bond_create_debugfs(void);
+void bond_destroy_debugfs(void);
+void bond_debug_register(struct bonding *bond);
+void bond_debug_unregister(struct bonding *bond);
+void bond_debug_reregister(struct bonding *bond);
 
 struct bond_net {
        struct net *            net;    /* Associated network namespace */