bonding: convert slaves to use the new option API
authorNikolay Aleksandrov <nikolay@redhat.com>
Wed, 22 Jan 2014 13:53:40 +0000 (14:53 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jan 2014 23:38:44 +0000 (15:38 -0800)
This patch adds the necessary changes so slaves would use
the new bonding option API. Also move the option to its own set function
in bond_options.c and fix some style errors.

Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_options.c
drivers/net/bonding/bond_options.h
drivers/net/bonding/bond_sysfs.c

index 60d7001398118d45e19678b4914b8d837e0aec1c..05a402c99bff5e4071ef554ecfc1e34f9c44f6ef 100644 (file)
@@ -300,6 +300,13 @@ static struct bond_option bond_opts[] = {
                .values = bond_lp_interval_tbl,
                .set = bond_option_lp_interval_set
        },
+       [BOND_OPT_SLAVES] = {
+               .id = BOND_OPT_SLAVES,
+               .name = "slaves",
+               .desc = "Slave membership management",
+               .flags = BOND_OPTFLAG_RAWVAL,
+               .set = bond_option_slaves_set
+       },
        { }
 };
 
@@ -1221,3 +1228,49 @@ err_no_cmd:
        goto out;
 
 }
+
+int bond_option_slaves_set(struct bonding *bond, struct bond_opt_value *newval)
+{
+       char command[IFNAMSIZ + 1] = { 0, };
+       struct net_device *dev;
+       char *ifname;
+       int ret;
+
+       sscanf(newval->string, "%16s", command); /* IFNAMSIZ*/
+       ifname = command + 1;
+       if ((strlen(command) <= 1) ||
+           !dev_valid_name(ifname))
+               goto err_no_cmd;
+
+       dev = __dev_get_by_name(dev_net(bond->dev), ifname);
+       if (!dev) {
+               pr_info("%s: Interface %s does not exist!\n",
+                       bond->dev->name, ifname);
+               ret = -ENODEV;
+               goto out;
+       }
+
+       switch (command[0]) {
+       case '+':
+               pr_info("%s: Adding slave %s.\n", bond->dev->name, dev->name);
+               ret = bond_enslave(bond->dev, dev);
+               break;
+
+       case '-':
+               pr_info("%s: Removing slave %s.\n", bond->dev->name, dev->name);
+               ret = bond_release(bond->dev, dev);
+               break;
+
+       default:
+               goto err_no_cmd;
+       }
+
+out:
+       return ret;
+
+err_no_cmd:
+       pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n",
+              bond->dev->name);
+       ret = -EPERM;
+       goto out;
+}
index eb3a773cb5a895a5055788783f0c32f408d7821e..433d37f6940b997649147ba4d8c0f415bdba47c9 100644 (file)
@@ -61,6 +61,7 @@ enum {
        BOND_OPT_ALL_SLAVES_ACTIVE,
        BOND_OPT_RESEND_IGMP,
        BOND_OPT_LP_INTERVAL,
+       BOND_OPT_SLAVES,
        BOND_OPT_LAST
 };
 
@@ -165,4 +166,5 @@ int bond_option_resend_igmp_set(struct bonding *bond,
                                struct bond_opt_value *newval);
 int bond_option_lp_interval_set(struct bonding *bond,
                                struct bond_opt_value *newval);
+int bond_option_slaves_set(struct bonding *bond, struct bond_opt_value *newval);
 #endif /* _BOND_OPTIONS_H */
index f7bc7917739ecc38d7434797b2bb3589a7519b25..643fcc110299b7b5c9f728703a849d8fd13d5ce8 100644 (file)
@@ -200,58 +200,15 @@ static ssize_t bonding_store_slaves(struct device *d,
                                    struct device_attribute *attr,
                                    const char *buffer, size_t count)
 {
-       char command[IFNAMSIZ + 1] = { 0, };
-       char *ifname;
-       int res, ret = count;
-       struct net_device *dev;
        struct bonding *bond = to_bond(d);
+       int ret;
 
-       if (!rtnl_trylock())
-               return restart_syscall();
-
-       sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
-       ifname = command + 1;
-       if ((strlen(command) <= 1) ||
-           !dev_valid_name(ifname))
-               goto err_no_cmd;
-
-       dev = __dev_get_by_name(dev_net(bond->dev), ifname);
-       if (!dev) {
-               pr_info("%s: Interface %s does not exist!\n",
-                       bond->dev->name, ifname);
-               ret = -ENODEV;
-               goto out;
-       }
-
-       switch (command[0]) {
-       case '+':
-               pr_info("%s: Adding slave %s.\n", bond->dev->name, dev->name);
-               res = bond_enslave(bond->dev, dev);
-               break;
-
-       case '-':
-               pr_info("%s: Removing slave %s.\n", bond->dev->name, dev->name);
-               res = bond_release(bond->dev, dev);
-               break;
-
-       default:
-               goto err_no_cmd;
-       }
-
-       if (res)
-               ret = res;
-       goto out;
-
-err_no_cmd:
-       pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n",
-              bond->dev->name);
-       ret = -EPERM;
+       ret = bond_opt_tryset_rtnl(bond, BOND_OPT_SLAVES, (char *)buffer);
+       if (!ret)
+               ret = count;
 
-out:
-       rtnl_unlock();
        return ret;
 }
-
 static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves,
                   bonding_store_slaves);