diff options
| -rw-r--r-- | drivers/net/bonding/Makefile | 2 | ||||
| -rw-r--r-- | drivers/net/bonding/bond_debugfs.c | 96 | ||||
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 10 | ||||
| -rw-r--r-- | drivers/net/bonding/bonding.h | 9 |
4 files changed, 115 insertions, 2 deletions
diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile index 6f9c6faef24c..0e2737eac8b7 100644 --- a/drivers/net/bonding/Makefile +++ b/drivers/net/bonding/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | obj-$(CONFIG_BONDING) += bonding.o | 5 | obj-$(CONFIG_BONDING) += bonding.o |
| 6 | 6 | ||
| 7 | bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o | 7 | bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o bond_debugfs.o |
| 8 | 8 | ||
| 9 | ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o | 9 | ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o |
| 10 | bonding-objs += $(ipv6-y) | 10 | bonding-objs += $(ipv6-y) |
diff --git a/drivers/net/bonding/bond_debugfs.c b/drivers/net/bonding/bond_debugfs.c new file mode 100644 index 000000000000..ae1eb2fc3a47 --- /dev/null +++ b/drivers/net/bonding/bond_debugfs.c | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | #include <linux/kernel.h> | ||
| 2 | #include <linux/module.h> | ||
| 3 | #include <linux/device.h> | ||
| 4 | #include <linux/netdevice.h> | ||
| 5 | |||
| 6 | #include "bonding.h" | ||
| 7 | |||
| 8 | #ifdef CONFIG_DEBUG_FS | ||
| 9 | |||
| 10 | #include <linux/debugfs.h> | ||
| 11 | #include <linux/seq_file.h> | ||
| 12 | |||
| 13 | static struct dentry *bonding_debug_root; | ||
| 14 | |||
| 15 | void bond_debug_register(struct bonding *bond) | ||
| 16 | { | ||
| 17 | if (!bonding_debug_root) | ||
| 18 | return; | ||
| 19 | |||
| 20 | bond->debug_dir = | ||
| 21 | debugfs_create_dir(bond->dev->name, bonding_debug_root); | ||
| 22 | |||
| 23 | if (!bond->debug_dir) { | ||
| 24 | pr_warning("%s: Warning: failed to register to debugfs\n", | ||
| 25 | bond->dev->name); | ||
| 26 | return; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | |||
| 30 | void bond_debug_unregister(struct bonding *bond) | ||
| 31 | { | ||
| 32 | if (!bonding_debug_root) | ||
| 33 | return; | ||
| 34 | |||
| 35 | debugfs_remove_recursive(bond->debug_dir); | ||
| 36 | } | ||
| 37 | |||
| 38 | void bond_debug_reregister(struct bonding *bond) | ||
| 39 | { | ||
| 40 | struct dentry *d; | ||
| 41 | |||
| 42 | if (!bonding_debug_root) | ||
| 43 | return; | ||
| 44 | |||
| 45 | d = debugfs_rename(bonding_debug_root, bond->debug_dir, | ||
| 46 | bonding_debug_root, bond->dev->name); | ||
| 47 | if (d) { | ||
| 48 | bond->debug_dir = d; | ||
| 49 | } else { | ||
| 50 | pr_warning("%s: Warning: failed to reregister, " | ||
| 51 | "so just unregister old one\n", | ||
| 52 | bond->dev->name); | ||
| 53 | bond_debug_unregister(bond); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | void bond_create_debugfs(void) | ||
| 58 | { | ||
| 59 | bonding_debug_root = debugfs_create_dir("bonding", NULL); | ||
| 60 | |||
| 61 | if (!bonding_debug_root) { | ||
| 62 | pr_warning("Warning: Cannot create bonding directory" | ||
| 63 | " in debugfs\n"); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | void bond_destroy_debugfs(void) | ||
| 68 | { | ||
| 69 | debugfs_remove_recursive(bonding_debug_root); | ||
| 70 | bonding_debug_root = NULL; | ||
| 71 | } | ||
| 72 | |||
| 73 | |||
| 74 | #else /* !CONFIG_DEBUG_FS */ | ||
| 75 | |||
| 76 | void bond_debug_register(struct bonding *bond) | ||
| 77 | { | ||
| 78 | } | ||
| 79 | |||
| 80 | void bond_debug_unregister(struct bonding *bond) | ||
| 81 | { | ||
| 82 | } | ||
| 83 | |||
| 84 | void bond_debug_reregister(struct bonding *bond) | ||
| 85 | { | ||
| 86 | } | ||
| 87 | |||
| 88 | void bond_create_debugfs(void) | ||
| 89 | { | ||
| 90 | } | ||
| 91 | |||
| 92 | void bond_destroy_debugfs(void) | ||
| 93 | { | ||
| 94 | } | ||
| 95 | |||
| 96 | #endif /* CONFIG_DEBUG_FS */ | ||
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index bb33b3b347fa..07011e42cec7 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -3503,6 +3503,8 @@ static int bond_event_changename(struct bonding *bond) | |||
| 3503 | bond_remove_proc_entry(bond); | 3503 | bond_remove_proc_entry(bond); |
| 3504 | bond_create_proc_entry(bond); | 3504 | bond_create_proc_entry(bond); |
| 3505 | 3505 | ||
| 3506 | bond_debug_reregister(bond); | ||
| 3507 | |||
| 3506 | return NOTIFY_DONE; | 3508 | return NOTIFY_DONE; |
| 3507 | } | 3509 | } |
| 3508 | 3510 | ||
| @@ -4785,6 +4787,8 @@ static void bond_uninit(struct net_device *bond_dev) | |||
| 4785 | 4787 | ||
| 4786 | bond_remove_proc_entry(bond); | 4788 | bond_remove_proc_entry(bond); |
| 4787 | 4789 | ||
| 4790 | bond_debug_unregister(bond); | ||
| 4791 | |||
| 4788 | __hw_addr_flush(&bond->mc_list); | 4792 | __hw_addr_flush(&bond->mc_list); |
| 4789 | 4793 | ||
| 4790 | list_for_each_entry_safe(vlan, tmp, &bond->vlan_list, vlan_list) { | 4794 | list_for_each_entry_safe(vlan, tmp, &bond->vlan_list, vlan_list) { |
| @@ -5187,6 +5191,8 @@ static int bond_init(struct net_device *bond_dev) | |||
| 5187 | 5191 | ||
| 5188 | bond_prepare_sysfs_group(bond); | 5192 | bond_prepare_sysfs_group(bond); |
| 5189 | 5193 | ||
| 5194 | bond_debug_register(bond); | ||
| 5195 | |||
| 5190 | __hw_addr_init(&bond->mc_list); | 5196 | __hw_addr_init(&bond->mc_list); |
| 5191 | return 0; | 5197 | return 0; |
| 5192 | } | 5198 | } |
| @@ -5308,6 +5314,8 @@ static int __init bonding_init(void) | |||
| 5308 | if (res) | 5314 | if (res) |
| 5309 | goto err_link; | 5315 | goto err_link; |
| 5310 | 5316 | ||
| 5317 | bond_create_debugfs(); | ||
| 5318 | |||
| 5311 | for (i = 0; i < max_bonds; i++) { | 5319 | for (i = 0; i < max_bonds; i++) { |
| 5312 | res = bond_create(&init_net, NULL); | 5320 | res = bond_create(&init_net, NULL); |
| 5313 | if (res) | 5321 | if (res) |
| @@ -5318,7 +5326,6 @@ static int __init bonding_init(void) | |||
| 5318 | if (res) | 5326 | if (res) |
| 5319 | goto err; | 5327 | goto err; |
| 5320 | 5328 | ||
| 5321 | |||
| 5322 | register_netdevice_notifier(&bond_netdev_notifier); | 5329 | register_netdevice_notifier(&bond_netdev_notifier); |
| 5323 | register_inetaddr_notifier(&bond_inetaddr_notifier); | 5330 | register_inetaddr_notifier(&bond_inetaddr_notifier); |
| 5324 | bond_register_ipv6_notifier(); | 5331 | bond_register_ipv6_notifier(); |
| @@ -5342,6 +5349,7 @@ static void __exit bonding_exit(void) | |||
| 5342 | bond_unregister_ipv6_notifier(); | 5349 | bond_unregister_ipv6_notifier(); |
| 5343 | 5350 | ||
| 5344 | bond_destroy_sysfs(); | 5351 | bond_destroy_sysfs(); |
| 5352 | bond_destroy_debugfs(); | ||
| 5345 | 5353 | ||
| 5346 | rtnl_link_unregister(&bond_link_ops); | 5354 | rtnl_link_unregister(&bond_link_ops); |
| 5347 | unregister_pernet_subsys(&bond_net_ops); | 5355 | unregister_pernet_subsys(&bond_net_ops); |
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index ad3ae46a4c01..03710f8f5c49 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h | |||
| @@ -259,6 +259,10 @@ struct bonding { | |||
| 259 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 259 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 260 | struct in6_addr master_ipv6; | 260 | struct in6_addr master_ipv6; |
| 261 | #endif | 261 | #endif |
| 262 | #ifdef CONFIG_DEBUG_FS | ||
| 263 | /* debugging suport via debugfs */ | ||
| 264 | struct dentry *debug_dir; | ||
| 265 | #endif /* CONFIG_DEBUG_FS */ | ||
| 262 | }; | 266 | }; |
| 263 | 267 | ||
| 264 | /** | 268 | /** |
| @@ -380,6 +384,11 @@ void bond_select_active_slave(struct bonding *bond); | |||
| 380 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); | 384 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); |
| 381 | void bond_register_arp(struct bonding *); | 385 | void bond_register_arp(struct bonding *); |
| 382 | void bond_unregister_arp(struct bonding *); | 386 | void bond_unregister_arp(struct bonding *); |
| 387 | void bond_create_debugfs(void); | ||
| 388 | void bond_destroy_debugfs(void); | ||
| 389 | void bond_debug_register(struct bonding *bond); | ||
| 390 | void bond_debug_unregister(struct bonding *bond); | ||
| 391 | void bond_debug_reregister(struct bonding *bond); | ||
| 383 | 392 | ||
| 384 | struct bond_net { | 393 | struct bond_net { |
| 385 | struct net * net; /* Associated network namespace */ | 394 | struct net * net; /* Associated network namespace */ |
