mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-02-14 08:19:28 +00:00
bonding: make bonding_store_slaves simpler
This patch makes bonding_store_slaves function nicer and easier to understand. Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3dd90905e0
commit
f9f3545e1e
@ -211,7 +211,8 @@ static ssize_t bonding_show_slaves(struct device *d,
|
|||||||
/*
|
/*
|
||||||
* Set the slaves in the current bond. The bond interface must be
|
* Set the slaves in the current bond. The bond interface must be
|
||||||
* up for this to succeed.
|
* up for this to succeed.
|
||||||
* This function is largely the same flow as bonding_update_bonds().
|
* This is supposed to be only thin wrapper for bond_enslave and bond_release.
|
||||||
|
* All hard work should be done there.
|
||||||
*/
|
*/
|
||||||
static ssize_t bonding_store_slaves(struct device *d,
|
static ssize_t bonding_store_slaves(struct device *d,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
@ -219,9 +220,8 @@ static ssize_t bonding_store_slaves(struct device *d,
|
|||||||
{
|
{
|
||||||
char command[IFNAMSIZ + 1] = { 0, };
|
char command[IFNAMSIZ + 1] = { 0, };
|
||||||
char *ifname;
|
char *ifname;
|
||||||
int i, res, ret = count;
|
int res, ret = count;
|
||||||
struct slave *slave;
|
struct net_device *dev;
|
||||||
struct net_device *dev = NULL;
|
|
||||||
struct bonding *bond = to_bond(d);
|
struct bonding *bond = to_bond(d);
|
||||||
|
|
||||||
/* Quick sanity check -- is the bond interface up? */
|
/* Quick sanity check -- is the bond interface up? */
|
||||||
@ -230,8 +230,6 @@ static ssize_t bonding_store_slaves(struct device *d,
|
|||||||
bond->dev->name);
|
bond->dev->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note: We can't hold bond->lock here, as bond_create grabs it. */
|
|
||||||
|
|
||||||
if (!rtnl_trylock())
|
if (!rtnl_trylock())
|
||||||
return restart_syscall();
|
return restart_syscall();
|
||||||
|
|
||||||
@ -241,19 +239,17 @@ static ssize_t bonding_store_slaves(struct device *d,
|
|||||||
!dev_valid_name(ifname))
|
!dev_valid_name(ifname))
|
||||||
goto err_no_cmd;
|
goto err_no_cmd;
|
||||||
|
|
||||||
if (command[0] == '+') {
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/* Got a slave name in ifname. */
|
switch (command[0]) {
|
||||||
|
case '+':
|
||||||
dev = __dev_get_by_name(dev_net(bond->dev), ifname);
|
pr_info("%s: Adding slave %s.\n", bond->dev->name, dev->name);
|
||||||
if (!dev) {
|
|
||||||
pr_info("%s: Interface %s does not exist!\n",
|
|
||||||
bond->dev->name, ifname);
|
|
||||||
ret = -ENODEV;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
pr_info("%s: Adding slave %s.\n", bond->dev->name, ifname);
|
|
||||||
|
|
||||||
/* If this is the first slave, then we need to set
|
/* If this is the first slave, then we need to set
|
||||||
the master's hardware address to be the same as the
|
the master's hardware address to be the same as the
|
||||||
@ -263,32 +259,20 @@ static ssize_t bonding_store_slaves(struct device *d,
|
|||||||
dev->addr_len);
|
dev->addr_len);
|
||||||
|
|
||||||
res = bond_enslave(bond->dev, dev);
|
res = bond_enslave(bond->dev, dev);
|
||||||
if (res)
|
break;
|
||||||
ret = res;
|
|
||||||
|
|
||||||
goto out;
|
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 (command[0] == '-') {
|
if (res)
|
||||||
dev = NULL;
|
ret = res;
|
||||||
bond_for_each_slave(bond, slave, i)
|
goto out;
|
||||||
if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
|
|
||||||
dev = slave->dev;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (dev) {
|
|
||||||
pr_info("%s: Removing slave %s\n",
|
|
||||||
bond->dev->name, dev->name);
|
|
||||||
res = bond_release(bond->dev, dev);
|
|
||||||
if (res)
|
|
||||||
ret = res;
|
|
||||||
} else {
|
|
||||||
pr_err("unable to remove non-existent slave %s for bond %s.\n",
|
|
||||||
ifname, bond->dev->name);
|
|
||||||
ret = -ENODEV;
|
|
||||||
}
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
err_no_cmd:
|
err_no_cmd:
|
||||||
pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n",
|
pr_err("no command found in slaves file for bond %s. Use +ifname or -ifname.\n",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user