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 */ |