aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/bonding/Makefile2
-rw-r--r--drivers/net/bonding/bond_debugfs.c96
-rw-r--r--drivers/net/bonding/bond_main.c10
-rw-r--r--drivers/net/bonding/bonding.h9
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
5obj-$(CONFIG_BONDING) += bonding.o 5obj-$(CONFIG_BONDING) += bonding.o
6 6
7bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o 7bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o bond_debugfs.o
8 8
9ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o 9ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o
10bonding-objs += $(ipv6-y) 10bonding-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
13static struct dentry *bonding_debug_root;
14
15void 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
30void bond_debug_unregister(struct bonding *bond)
31{
32 if (!bonding_debug_root)
33 return;
34
35 debugfs_remove_recursive(bond->debug_dir);
36}
37
38void 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
57void 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
67void 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
76void bond_debug_register(struct bonding *bond)
77{
78}
79
80void bond_debug_unregister(struct bonding *bond)
81{
82}
83
84void bond_debug_reregister(struct bonding *bond)
85{
86}
87
88void bond_create_debugfs(void)
89{
90}
91
92void 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);
380void bond_change_active_slave(struct bonding *bond, struct slave *new_active); 384void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
381void bond_register_arp(struct bonding *); 385void bond_register_arp(struct bonding *);
382void bond_unregister_arp(struct bonding *); 386void bond_unregister_arp(struct bonding *);
387void bond_create_debugfs(void);
388void bond_destroy_debugfs(void);
389void bond_debug_register(struct bonding *bond);
390void bond_debug_unregister(struct bonding *bond);
391void bond_debug_reregister(struct bonding *bond);
383 392
384struct bond_net { 393struct bond_net {
385 struct net * net; /* Associated network namespace */ 394 struct net * net; /* Associated network namespace */