bonding: convert slaves to use the new option API

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>
This commit is contained in:
Nikolay Aleksandrov 2014-01-22 14:53:40 +01:00 коммит произвёл David S. Miller
Родитель 4325b374f8
Коммит 0e2e5b66e9
3 изменённых файлов: 59 добавлений и 47 удалений

Просмотреть файл

@ -300,6 +300,13 @@ static struct bond_option bond_opts[] = {
.values = bond_lp_interval_tbl, .values = bond_lp_interval_tbl,
.set = bond_option_lp_interval_set .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; 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;
}

Просмотреть файл

@ -61,6 +61,7 @@ enum {
BOND_OPT_ALL_SLAVES_ACTIVE, BOND_OPT_ALL_SLAVES_ACTIVE,
BOND_OPT_RESEND_IGMP, BOND_OPT_RESEND_IGMP,
BOND_OPT_LP_INTERVAL, BOND_OPT_LP_INTERVAL,
BOND_OPT_SLAVES,
BOND_OPT_LAST BOND_OPT_LAST
}; };
@ -165,4 +166,5 @@ int bond_option_resend_igmp_set(struct bonding *bond,
struct bond_opt_value *newval); struct bond_opt_value *newval);
int bond_option_lp_interval_set(struct bonding *bond, int bond_option_lp_interval_set(struct bonding *bond,
struct bond_opt_value *newval); struct bond_opt_value *newval);
int bond_option_slaves_set(struct bonding *bond, struct bond_opt_value *newval);
#endif /* _BOND_OPTIONS_H */ #endif /* _BOND_OPTIONS_H */

Просмотреть файл

@ -200,58 +200,15 @@ static ssize_t bonding_store_slaves(struct device *d,
struct device_attribute *attr, struct device_attribute *attr,
const char *buffer, size_t count) 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); struct bonding *bond = to_bond(d);
int ret;
if (!rtnl_trylock()) ret = bond_opt_tryset_rtnl(bond, BOND_OPT_SLAVES, (char *)buffer);
return restart_syscall(); if (!ret)
ret = count;
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;
out:
rtnl_unlock();
return ret; return ret;
} }
static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves, static DEVICE_ATTR(slaves, S_IRUGO | S_IWUSR, bonding_show_slaves,
bonding_store_slaves); bonding_store_slaves);