Commit f9f3545e authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

bonding: make bonding_store_slaves simpler



This patch makes bonding_store_slaves function nicer and easier to understand.

Signed-off-by: default avatarJiri Pirko <jpirko@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3dd90905
Loading
Loading
Loading
Loading
+25 −41
Original line number Original line Diff line number Diff line
@@ -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,10 +239,6 @@ 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] == '+') {

		/* Got a slave name in ifname. */

	dev = __dev_get_by_name(dev_net(bond->dev), ifname);
	dev = __dev_get_by_name(dev_net(bond->dev), ifname);
	if (!dev) {
	if (!dev) {
		pr_info("%s: Interface %s does not exist!\n",
		pr_info("%s: Interface %s does not exist!\n",
@@ -253,7 +247,9 @@ static ssize_t bonding_store_slaves(struct device *d,
		goto out;
		goto out;
	}
	}


		pr_info("%s: Adding slave %s.\n", bond->dev->name, ifname);
	switch (command[0]) {
	case '+':
		pr_info("%s: Adding slave %s.\n", bond->dev->name, dev->name);


		/* 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;
	}


	if (command[0] == '-') {
	case '-':
		dev = NULL;
		pr_info("%s: Removing slave %s.\n", bond->dev->name, dev->name);
		bond_for_each_slave(bond, slave, i)
		res = bond_release(bond->dev, dev);
			if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
				dev = slave->dev;
		break;
		break;

	default:
		goto err_no_cmd;
	}
	}
		if (dev) {

			pr_info("%s: Removing slave %s\n",
				bond->dev->name, dev->name);
			res = bond_release(bond->dev, dev);
	if (res)
	if (res)
		ret = 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;
	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",