bonding: add sysfs /slave dir for bond slave devices.
authorsfeldma@cumulusnetworks.com <sfeldma@cumulusnetworks.com>
Fri, 17 Jan 2014 06:57:49 +0000 (22:57 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 18 Jan 2014 02:51:58 +0000 (18:51 -0800)
Add sub-directory under /sys/class/net/<interface>/slave with
read-only attributes for slave.  Directory only appears when
<interface> is a slave.

$ tree /sys/class/net/eth2/slave/
/sys/class/net/eth2/slave/
├── ad_aggregator_id
├── link_failure_count
├── mii_status
├── perm_hwaddr
├── queue_id
└── state

$ cat /sys/class/net/eth2/slave/*
2
0
up
40:02:10:ef:06:01
0
active

Signed-off-by: Scott Feldman <sfeldma@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/Makefile
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_procfs.c
drivers/net/bonding/bond_sysfs_slave.c [new file with mode: 0644]
drivers/net/bonding/bonding.h

index 5a5d720..6f4e808 100644 (file)
@@ -4,7 +4,7 @@
 
 obj-$(CONFIG_BONDING) += bonding.o
 
-bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o bond_debugfs.o bond_netlink.o bond_options.o
+bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o bond_sysfs_slave.o bond_debugfs.o bond_netlink.o bond_options.o
 
 proc-$(CONFIG_PROC_FS) += bond_procfs.o
 bonding-objs += $(proc-y)
index f00dd45..df85cec 100644 (file)
@@ -466,6 +466,22 @@ static void bond_update_speed_duplex(struct slave *slave)
        return;
 }
 
+const char *bond_slave_link_status(s8 link)
+{
+       switch (link) {
+       case BOND_LINK_UP:
+               return "up";
+       case BOND_LINK_FAIL:
+               return "going down";
+       case BOND_LINK_DOWN:
+               return "down";
+       case BOND_LINK_BACK:
+               return "going back";
+       default:
+               return "unknown";
+       }
+}
+
 /*
  * if <dev> supports MII link status reporting, check its link status.
  *
@@ -1576,6 +1592,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
                goto err_unregister;
        }
 
+       res = bond_sysfs_slave_add(new_slave);
+       if (res) {
+               pr_debug("Error %d calling bond_sysfs_slave_add\n", res);
+               goto err_upper_unlink;
+       }
+
        bond->slave_cnt++;
        bond_compute_features(bond);
        bond_set_carrier(bond);
@@ -1595,6 +1617,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
        return 0;
 
 /* Undo stages on error */
+err_upper_unlink:
+       bond_upper_dev_unlink(bond_dev, slave_dev);
+
 err_unregister:
        netdev_rx_handler_unregister(slave_dev);
 
@@ -1687,6 +1712,8 @@ static int __bond_release_one(struct net_device *bond_dev,
        /* release the slave from its bond */
        bond->slave_cnt--;
 
+       bond_sysfs_slave_del(slave);
+
        bond_upper_dev_unlink(bond_dev, slave_dev);
        /* unregister rx_handler early so bond_handle_frame wouldn't be called
         * for this slave anymore.
index fb868d6..8515b34 100644 (file)
@@ -159,18 +159,6 @@ static void bond_info_show_master(struct seq_file *seq)
        }
 }
 
-static const char *bond_slave_link_status(s8 link)
-{
-       static const char * const status[] = {
-               [BOND_LINK_UP] = "up",
-               [BOND_LINK_FAIL] = "going down",
-               [BOND_LINK_DOWN] = "down",
-               [BOND_LINK_BACK] = "going back",
-       };
-
-       return status[link];
-}
-
 static void bond_info_show_slave(struct seq_file *seq,
                                 const struct slave *slave)
 {
Simple merge