Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bonding: move procfs code into bond_procfs.c

V2: Move #ifdef CONFIG_PROC_FS into bonding.h, as suggested by David.

bond_main.c is bloating, separate the procfs code out,
move them to bond_procfs.c

Signed-off-by: WANG Cong <amwang@redhat.com>
Reviewed-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Amerigo Wang and committed by
David S. Miller
bd33acc3 a015f6f4

+306 -300
+3
drivers/net/bonding/Makefile
··· 6 6 7 7 bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o bond_debugfs.o 8 8 9 + proc-$(CONFIG_PROC_FS) += bond_procfs.o 10 + bonding-objs += $(proc-y) 11 + 9 12 ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o 10 13 bonding-objs += $(ipv6-y) 11 14
+2 -300
drivers/net/bonding/bond_main.c
··· 65 65 #include <linux/skbuff.h> 66 66 #include <net/sock.h> 67 67 #include <linux/rtnetlink.h> 68 - #include <linux/proc_fs.h> 69 - #include <linux/seq_file.h> 70 68 #include <linux/smp.h> 71 69 #include <linux/if_ether.h> 72 70 #include <net/arp.h> ··· 171 173 atomic_t netpoll_block_tx = ATOMIC_INIT(0); 172 174 #endif 173 175 174 - static const char * const version = 175 - DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n"; 176 - 177 176 int bond_net_id __read_mostly; 178 177 179 178 static __be32 arp_target[BOND_MAX_ARP_TARGETS]; ··· 240 245 241 246 /*---------------------------- General routines -----------------------------*/ 242 247 243 - static const char *bond_mode_name(int mode) 248 + const char *bond_mode_name(int mode) 244 249 { 245 250 static const char *names[] = { 246 251 [BOND_MODE_ROUNDROBIN] = "load balancing (round-robin)", ··· 3283 3288 read_unlock(&bond->lock); 3284 3289 } 3285 3290 3286 - /*------------------------------ proc/seq_file-------------------------------*/ 3287 - 3288 - #ifdef CONFIG_PROC_FS 3289 - 3290 - static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos) 3291 - __acquires(RCU) 3292 - __acquires(&bond->lock) 3293 - { 3294 - struct bonding *bond = seq->private; 3295 - loff_t off = 0; 3296 - struct slave *slave; 3297 - int i; 3298 - 3299 - /* make sure the bond won't be taken away */ 3300 - rcu_read_lock(); 3301 - read_lock(&bond->lock); 3302 - 3303 - if (*pos == 0) 3304 - return SEQ_START_TOKEN; 3305 - 3306 - bond_for_each_slave(bond, slave, i) { 3307 - if (++off == *pos) 3308 - return slave; 3309 - } 3310 - 3311 - return NULL; 3312 - } 3313 - 3314 - static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos) 3315 - { 3316 - struct bonding *bond = seq->private; 3317 - struct slave *slave = v; 3318 - 3319 - ++*pos; 3320 - if (v == SEQ_START_TOKEN) 3321 - return bond->first_slave; 3322 - 3323 - slave = slave->next; 3324 - 3325 - return (slave == bond->first_slave) ? NULL : slave; 3326 - } 3327 - 3328 - static void bond_info_seq_stop(struct seq_file *seq, void *v) 3329 - __releases(&bond->lock) 3330 - __releases(RCU) 3331 - { 3332 - struct bonding *bond = seq->private; 3333 - 3334 - read_unlock(&bond->lock); 3335 - rcu_read_unlock(); 3336 - } 3337 - 3338 - static void bond_info_show_master(struct seq_file *seq) 3339 - { 3340 - struct bonding *bond = seq->private; 3341 - struct slave *curr; 3342 - int i; 3343 - 3344 - read_lock(&bond->curr_slave_lock); 3345 - curr = bond->curr_active_slave; 3346 - read_unlock(&bond->curr_slave_lock); 3347 - 3348 - seq_printf(seq, "Bonding Mode: %s", 3349 - bond_mode_name(bond->params.mode)); 3350 - 3351 - if (bond->params.mode == BOND_MODE_ACTIVEBACKUP && 3352 - bond->params.fail_over_mac) 3353 - seq_printf(seq, " (fail_over_mac %s)", 3354 - fail_over_mac_tbl[bond->params.fail_over_mac].modename); 3355 - 3356 - seq_printf(seq, "\n"); 3357 - 3358 - if (bond->params.mode == BOND_MODE_XOR || 3359 - bond->params.mode == BOND_MODE_8023AD) { 3360 - seq_printf(seq, "Transmit Hash Policy: %s (%d)\n", 3361 - xmit_hashtype_tbl[bond->params.xmit_policy].modename, 3362 - bond->params.xmit_policy); 3363 - } 3364 - 3365 - if (USES_PRIMARY(bond->params.mode)) { 3366 - seq_printf(seq, "Primary Slave: %s", 3367 - (bond->primary_slave) ? 3368 - bond->primary_slave->dev->name : "None"); 3369 - if (bond->primary_slave) 3370 - seq_printf(seq, " (primary_reselect %s)", 3371 - pri_reselect_tbl[bond->params.primary_reselect].modename); 3372 - 3373 - seq_printf(seq, "\nCurrently Active Slave: %s\n", 3374 - (curr) ? curr->dev->name : "None"); 3375 - } 3376 - 3377 - seq_printf(seq, "MII Status: %s\n", netif_carrier_ok(bond->dev) ? 3378 - "up" : "down"); 3379 - seq_printf(seq, "MII Polling Interval (ms): %d\n", bond->params.miimon); 3380 - seq_printf(seq, "Up Delay (ms): %d\n", 3381 - bond->params.updelay * bond->params.miimon); 3382 - seq_printf(seq, "Down Delay (ms): %d\n", 3383 - bond->params.downdelay * bond->params.miimon); 3384 - 3385 - 3386 - /* ARP information */ 3387 - if (bond->params.arp_interval > 0) { 3388 - int printed = 0; 3389 - seq_printf(seq, "ARP Polling Interval (ms): %d\n", 3390 - bond->params.arp_interval); 3391 - 3392 - seq_printf(seq, "ARP IP target/s (n.n.n.n form):"); 3393 - 3394 - for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) { 3395 - if (!bond->params.arp_targets[i]) 3396 - break; 3397 - if (printed) 3398 - seq_printf(seq, ","); 3399 - seq_printf(seq, " %pI4", &bond->params.arp_targets[i]); 3400 - printed = 1; 3401 - } 3402 - seq_printf(seq, "\n"); 3403 - } 3404 - 3405 - if (bond->params.mode == BOND_MODE_8023AD) { 3406 - struct ad_info ad_info; 3407 - 3408 - seq_puts(seq, "\n802.3ad info\n"); 3409 - seq_printf(seq, "LACP rate: %s\n", 3410 - (bond->params.lacp_fast) ? "fast" : "slow"); 3411 - seq_printf(seq, "Aggregator selection policy (ad_select): %s\n", 3412 - ad_select_tbl[bond->params.ad_select].modename); 3413 - 3414 - if (bond_3ad_get_active_agg_info(bond, &ad_info)) { 3415 - seq_printf(seq, "bond %s has no active aggregator\n", 3416 - bond->dev->name); 3417 - } else { 3418 - seq_printf(seq, "Active Aggregator Info:\n"); 3419 - 3420 - seq_printf(seq, "\tAggregator ID: %d\n", 3421 - ad_info.aggregator_id); 3422 - seq_printf(seq, "\tNumber of ports: %d\n", 3423 - ad_info.ports); 3424 - seq_printf(seq, "\tActor Key: %d\n", 3425 - ad_info.actor_key); 3426 - seq_printf(seq, "\tPartner Key: %d\n", 3427 - ad_info.partner_key); 3428 - seq_printf(seq, "\tPartner Mac Address: %pM\n", 3429 - ad_info.partner_system); 3430 - } 3431 - } 3432 - } 3433 - 3434 - static void bond_info_show_slave(struct seq_file *seq, 3435 - const struct slave *slave) 3436 - { 3437 - struct bonding *bond = seq->private; 3438 - 3439 - seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name); 3440 - seq_printf(seq, "MII Status: %s\n", 3441 - (slave->link == BOND_LINK_UP) ? "up" : "down"); 3442 - seq_printf(seq, "Speed: %d Mbps\n", slave->speed); 3443 - seq_printf(seq, "Duplex: %s\n", slave->duplex ? "full" : "half"); 3444 - seq_printf(seq, "Link Failure Count: %u\n", 3445 - slave->link_failure_count); 3446 - 3447 - seq_printf(seq, "Permanent HW addr: %pM\n", slave->perm_hwaddr); 3448 - 3449 - if (bond->params.mode == BOND_MODE_8023AD) { 3450 - const struct aggregator *agg 3451 - = SLAVE_AD_INFO(slave).port.aggregator; 3452 - 3453 - if (agg) 3454 - seq_printf(seq, "Aggregator ID: %d\n", 3455 - agg->aggregator_identifier); 3456 - else 3457 - seq_puts(seq, "Aggregator ID: N/A\n"); 3458 - } 3459 - seq_printf(seq, "Slave queue ID: %d\n", slave->queue_id); 3460 - } 3461 - 3462 - static int bond_info_seq_show(struct seq_file *seq, void *v) 3463 - { 3464 - if (v == SEQ_START_TOKEN) { 3465 - seq_printf(seq, "%s\n", version); 3466 - bond_info_show_master(seq); 3467 - } else 3468 - bond_info_show_slave(seq, v); 3469 - 3470 - return 0; 3471 - } 3472 - 3473 - static const struct seq_operations bond_info_seq_ops = { 3474 - .start = bond_info_seq_start, 3475 - .next = bond_info_seq_next, 3476 - .stop = bond_info_seq_stop, 3477 - .show = bond_info_seq_show, 3478 - }; 3479 - 3480 - static int bond_info_open(struct inode *inode, struct file *file) 3481 - { 3482 - struct seq_file *seq; 3483 - struct proc_dir_entry *proc; 3484 - int res; 3485 - 3486 - res = seq_open(file, &bond_info_seq_ops); 3487 - if (!res) { 3488 - /* recover the pointer buried in proc_dir_entry data */ 3489 - seq = file->private_data; 3490 - proc = PDE(inode); 3491 - seq->private = proc->data; 3492 - } 3493 - 3494 - return res; 3495 - } 3496 - 3497 - static const struct file_operations bond_info_fops = { 3498 - .owner = THIS_MODULE, 3499 - .open = bond_info_open, 3500 - .read = seq_read, 3501 - .llseek = seq_lseek, 3502 - .release = seq_release, 3503 - }; 3504 - 3505 - static void bond_create_proc_entry(struct bonding *bond) 3506 - { 3507 - struct net_device *bond_dev = bond->dev; 3508 - struct bond_net *bn = net_generic(dev_net(bond_dev), bond_net_id); 3509 - 3510 - if (bn->proc_dir) { 3511 - bond->proc_entry = proc_create_data(bond_dev->name, 3512 - S_IRUGO, bn->proc_dir, 3513 - &bond_info_fops, bond); 3514 - if (bond->proc_entry == NULL) 3515 - pr_warning("Warning: Cannot create /proc/net/%s/%s\n", 3516 - DRV_NAME, bond_dev->name); 3517 - else 3518 - memcpy(bond->proc_file_name, bond_dev->name, IFNAMSIZ); 3519 - } 3520 - } 3521 - 3522 - static void bond_remove_proc_entry(struct bonding *bond) 3523 - { 3524 - struct net_device *bond_dev = bond->dev; 3525 - struct bond_net *bn = net_generic(dev_net(bond_dev), bond_net_id); 3526 - 3527 - if (bn->proc_dir && bond->proc_entry) { 3528 - remove_proc_entry(bond->proc_file_name, bn->proc_dir); 3529 - memset(bond->proc_file_name, 0, IFNAMSIZ); 3530 - bond->proc_entry = NULL; 3531 - } 3532 - } 3533 - 3534 - /* Create the bonding directory under /proc/net, if doesn't exist yet. 3535 - * Caller must hold rtnl_lock. 3536 - */ 3537 - static void __net_init bond_create_proc_dir(struct bond_net *bn) 3538 - { 3539 - if (!bn->proc_dir) { 3540 - bn->proc_dir = proc_mkdir(DRV_NAME, bn->net->proc_net); 3541 - if (!bn->proc_dir) 3542 - pr_warning("Warning: cannot create /proc/net/%s\n", 3543 - DRV_NAME); 3544 - } 3545 - } 3546 - 3547 - /* Destroy the bonding directory under /proc/net, if empty. 3548 - * Caller must hold rtnl_lock. 3549 - */ 3550 - static void __net_exit bond_destroy_proc_dir(struct bond_net *bn) 3551 - { 3552 - if (bn->proc_dir) { 3553 - remove_proc_entry(DRV_NAME, bn->net->proc_net); 3554 - bn->proc_dir = NULL; 3555 - } 3556 - } 3557 - 3558 - #else /* !CONFIG_PROC_FS */ 3559 - 3560 - static void bond_create_proc_entry(struct bonding *bond) 3561 - { 3562 - } 3563 - 3564 - static void bond_remove_proc_entry(struct bonding *bond) 3565 - { 3566 - } 3567 - 3568 - static inline void bond_create_proc_dir(struct bond_net *bn) 3569 - { 3570 - } 3571 - 3572 - static inline void bond_destroy_proc_dir(struct bond_net *bn) 3573 - { 3574 - } 3575 - 3576 - #endif /* CONFIG_PROC_FS */ 3577 - 3578 - 3579 3291 /*-------------------------- netdev event handling --------------------------*/ 3580 3292 3581 3293 /* ··· 5086 5384 int i; 5087 5385 int res; 5088 5386 5089 - pr_info("%s", version); 5387 + pr_info("%s", bond_version); 5090 5388 5091 5389 res = bond_check_params(&bonding_defaults); 5092 5390 if (res)
+275
drivers/net/bonding/bond_procfs.c
··· 1 + #include <linux/proc_fs.h> 2 + #include <net/net_namespace.h> 3 + #include <net/netns/generic.h> 4 + #include "bonding.h" 5 + 6 + 7 + extern const char *bond_mode_name(int mode); 8 + 9 + static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos) 10 + __acquires(RCU) 11 + __acquires(&bond->lock) 12 + { 13 + struct bonding *bond = seq->private; 14 + loff_t off = 0; 15 + struct slave *slave; 16 + int i; 17 + 18 + /* make sure the bond won't be taken away */ 19 + rcu_read_lock(); 20 + read_lock(&bond->lock); 21 + 22 + if (*pos == 0) 23 + return SEQ_START_TOKEN; 24 + 25 + bond_for_each_slave(bond, slave, i) { 26 + if (++off == *pos) 27 + return slave; 28 + } 29 + 30 + return NULL; 31 + } 32 + 33 + static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos) 34 + { 35 + struct bonding *bond = seq->private; 36 + struct slave *slave = v; 37 + 38 + ++*pos; 39 + if (v == SEQ_START_TOKEN) 40 + return bond->first_slave; 41 + 42 + slave = slave->next; 43 + 44 + return (slave == bond->first_slave) ? NULL : slave; 45 + } 46 + 47 + static void bond_info_seq_stop(struct seq_file *seq, void *v) 48 + __releases(&bond->lock) 49 + __releases(RCU) 50 + { 51 + struct bonding *bond = seq->private; 52 + 53 + read_unlock(&bond->lock); 54 + rcu_read_unlock(); 55 + } 56 + 57 + static void bond_info_show_master(struct seq_file *seq) 58 + { 59 + struct bonding *bond = seq->private; 60 + struct slave *curr; 61 + int i; 62 + 63 + read_lock(&bond->curr_slave_lock); 64 + curr = bond->curr_active_slave; 65 + read_unlock(&bond->curr_slave_lock); 66 + 67 + seq_printf(seq, "Bonding Mode: %s", 68 + bond_mode_name(bond->params.mode)); 69 + 70 + if (bond->params.mode == BOND_MODE_ACTIVEBACKUP && 71 + bond->params.fail_over_mac) 72 + seq_printf(seq, " (fail_over_mac %s)", 73 + fail_over_mac_tbl[bond->params.fail_over_mac].modename); 74 + 75 + seq_printf(seq, "\n"); 76 + 77 + if (bond->params.mode == BOND_MODE_XOR || 78 + bond->params.mode == BOND_MODE_8023AD) { 79 + seq_printf(seq, "Transmit Hash Policy: %s (%d)\n", 80 + xmit_hashtype_tbl[bond->params.xmit_policy].modename, 81 + bond->params.xmit_policy); 82 + } 83 + 84 + if (USES_PRIMARY(bond->params.mode)) { 85 + seq_printf(seq, "Primary Slave: %s", 86 + (bond->primary_slave) ? 87 + bond->primary_slave->dev->name : "None"); 88 + if (bond->primary_slave) 89 + seq_printf(seq, " (primary_reselect %s)", 90 + pri_reselect_tbl[bond->params.primary_reselect].modename); 91 + 92 + seq_printf(seq, "\nCurrently Active Slave: %s\n", 93 + (curr) ? curr->dev->name : "None"); 94 + } 95 + 96 + seq_printf(seq, "MII Status: %s\n", netif_carrier_ok(bond->dev) ? 97 + "up" : "down"); 98 + seq_printf(seq, "MII Polling Interval (ms): %d\n", bond->params.miimon); 99 + seq_printf(seq, "Up Delay (ms): %d\n", 100 + bond->params.updelay * bond->params.miimon); 101 + seq_printf(seq, "Down Delay (ms): %d\n", 102 + bond->params.downdelay * bond->params.miimon); 103 + 104 + 105 + /* ARP information */ 106 + if (bond->params.arp_interval > 0) { 107 + int printed = 0; 108 + seq_printf(seq, "ARP Polling Interval (ms): %d\n", 109 + bond->params.arp_interval); 110 + 111 + seq_printf(seq, "ARP IP target/s (n.n.n.n form):"); 112 + 113 + for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) { 114 + if (!bond->params.arp_targets[i]) 115 + break; 116 + if (printed) 117 + seq_printf(seq, ","); 118 + seq_printf(seq, " %pI4", &bond->params.arp_targets[i]); 119 + printed = 1; 120 + } 121 + seq_printf(seq, "\n"); 122 + } 123 + 124 + if (bond->params.mode == BOND_MODE_8023AD) { 125 + struct ad_info ad_info; 126 + 127 + seq_puts(seq, "\n802.3ad info\n"); 128 + seq_printf(seq, "LACP rate: %s\n", 129 + (bond->params.lacp_fast) ? "fast" : "slow"); 130 + seq_printf(seq, "Aggregator selection policy (ad_select): %s\n", 131 + ad_select_tbl[bond->params.ad_select].modename); 132 + 133 + if (bond_3ad_get_active_agg_info(bond, &ad_info)) { 134 + seq_printf(seq, "bond %s has no active aggregator\n", 135 + bond->dev->name); 136 + } else { 137 + seq_printf(seq, "Active Aggregator Info:\n"); 138 + 139 + seq_printf(seq, "\tAggregator ID: %d\n", 140 + ad_info.aggregator_id); 141 + seq_printf(seq, "\tNumber of ports: %d\n", 142 + ad_info.ports); 143 + seq_printf(seq, "\tActor Key: %d\n", 144 + ad_info.actor_key); 145 + seq_printf(seq, "\tPartner Key: %d\n", 146 + ad_info.partner_key); 147 + seq_printf(seq, "\tPartner Mac Address: %pM\n", 148 + ad_info.partner_system); 149 + } 150 + } 151 + } 152 + 153 + static void bond_info_show_slave(struct seq_file *seq, 154 + const struct slave *slave) 155 + { 156 + struct bonding *bond = seq->private; 157 + 158 + seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name); 159 + seq_printf(seq, "MII Status: %s\n", 160 + (slave->link == BOND_LINK_UP) ? "up" : "down"); 161 + seq_printf(seq, "Speed: %d Mbps\n", slave->speed); 162 + seq_printf(seq, "Duplex: %s\n", slave->duplex ? "full" : "half"); 163 + seq_printf(seq, "Link Failure Count: %u\n", 164 + slave->link_failure_count); 165 + 166 + seq_printf(seq, "Permanent HW addr: %pM\n", slave->perm_hwaddr); 167 + 168 + if (bond->params.mode == BOND_MODE_8023AD) { 169 + const struct aggregator *agg 170 + = SLAVE_AD_INFO(slave).port.aggregator; 171 + 172 + if (agg) 173 + seq_printf(seq, "Aggregator ID: %d\n", 174 + agg->aggregator_identifier); 175 + else 176 + seq_puts(seq, "Aggregator ID: N/A\n"); 177 + } 178 + seq_printf(seq, "Slave queue ID: %d\n", slave->queue_id); 179 + } 180 + 181 + static int bond_info_seq_show(struct seq_file *seq, void *v) 182 + { 183 + if (v == SEQ_START_TOKEN) { 184 + seq_printf(seq, "%s\n", bond_version); 185 + bond_info_show_master(seq); 186 + } else 187 + bond_info_show_slave(seq, v); 188 + 189 + return 0; 190 + } 191 + 192 + static const struct seq_operations bond_info_seq_ops = { 193 + .start = bond_info_seq_start, 194 + .next = bond_info_seq_next, 195 + .stop = bond_info_seq_stop, 196 + .show = bond_info_seq_show, 197 + }; 198 + 199 + static int bond_info_open(struct inode *inode, struct file *file) 200 + { 201 + struct seq_file *seq; 202 + struct proc_dir_entry *proc; 203 + int res; 204 + 205 + res = seq_open(file, &bond_info_seq_ops); 206 + if (!res) { 207 + /* recover the pointer buried in proc_dir_entry data */ 208 + seq = file->private_data; 209 + proc = PDE(inode); 210 + seq->private = proc->data; 211 + } 212 + 213 + return res; 214 + } 215 + 216 + static const struct file_operations bond_info_fops = { 217 + .owner = THIS_MODULE, 218 + .open = bond_info_open, 219 + .read = seq_read, 220 + .llseek = seq_lseek, 221 + .release = seq_release, 222 + }; 223 + 224 + void bond_create_proc_entry(struct bonding *bond) 225 + { 226 + struct net_device *bond_dev = bond->dev; 227 + struct bond_net *bn = net_generic(dev_net(bond_dev), bond_net_id); 228 + 229 + if (bn->proc_dir) { 230 + bond->proc_entry = proc_create_data(bond_dev->name, 231 + S_IRUGO, bn->proc_dir, 232 + &bond_info_fops, bond); 233 + if (bond->proc_entry == NULL) 234 + pr_warning("Warning: Cannot create /proc/net/%s/%s\n", 235 + DRV_NAME, bond_dev->name); 236 + else 237 + memcpy(bond->proc_file_name, bond_dev->name, IFNAMSIZ); 238 + } 239 + } 240 + 241 + void bond_remove_proc_entry(struct bonding *bond) 242 + { 243 + struct net_device *bond_dev = bond->dev; 244 + struct bond_net *bn = net_generic(dev_net(bond_dev), bond_net_id); 245 + 246 + if (bn->proc_dir && bond->proc_entry) { 247 + remove_proc_entry(bond->proc_file_name, bn->proc_dir); 248 + memset(bond->proc_file_name, 0, IFNAMSIZ); 249 + bond->proc_entry = NULL; 250 + } 251 + } 252 + 253 + /* Create the bonding directory under /proc/net, if doesn't exist yet. 254 + * Caller must hold rtnl_lock. 255 + */ 256 + void __net_init bond_create_proc_dir(struct bond_net *bn) 257 + { 258 + if (!bn->proc_dir) { 259 + bn->proc_dir = proc_mkdir(DRV_NAME, bn->net->proc_net); 260 + if (!bn->proc_dir) 261 + pr_warning("Warning: cannot create /proc/net/%s\n", 262 + DRV_NAME); 263 + } 264 + } 265 + 266 + /* Destroy the bonding directory under /proc/net, if empty. 267 + * Caller must hold rtnl_lock. 268 + */ 269 + void __net_exit bond_destroy_proc_dir(struct bond_net *bn) 270 + { 271 + if (bn->proc_dir) { 272 + remove_proc_entry(DRV_NAME, bn->net->proc_net); 273 + bn->proc_dir = NULL; 274 + } 275 + }
+26
drivers/net/bonding/bonding.h
··· 29 29 #define DRV_NAME "bonding" 30 30 #define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" 31 31 32 + #define bond_version DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n" 33 + 32 34 #define BOND_MAX_ARP_TARGETS 16 33 35 34 36 #define IS_UP(dev) \ ··· 415 413 struct proc_dir_entry * proc_dir; 416 414 #endif 417 415 }; 416 + 417 + #ifdef CONFIG_PROC_FS 418 + void bond_create_proc_entry(struct bonding *bond); 419 + void bond_remove_proc_entry(struct bonding *bond); 420 + void bond_create_proc_dir(struct bond_net *bn); 421 + void bond_destroy_proc_dir(struct bond_net *bn); 422 + #else 423 + static inline void bond_create_proc_entry(struct bonding *bond) 424 + { 425 + } 426 + 427 + static inline void bond_remove_proc_entry(struct bonding *bond) 428 + { 429 + } 430 + 431 + static inline void bond_create_proc_dir(struct bond_net *bn) 432 + { 433 + } 434 + 435 + static inline void bond_destroy_proc_dir(struct bond_net *bn) 436 + { 437 + } 438 + #endif 439 + 418 440 419 441 /* exported from bond_main.c */ 420 442 extern int bond_net_id;