Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e083840 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller
Browse files

bonding: remove bonding read/write semaphore



The whole read/write semaphore locking can be removed. It doesn't add any
protection that isn't already done by using the RTNL mutex properly.

Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d9321605
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -3489,10 +3489,10 @@ static int bond_event_changename(struct bonding *bond)
{
	bond_remove_proc_entry(bond);
	bond_create_proc_entry(bond);
	down_write(&(bonding_rwsem));

        bond_destroy_sysfs_entry(bond);
        bond_create_sysfs_entry(bond);
	up_write(&(bonding_rwsem));

	return NOTIFY_DONE;
}

@@ -4015,7 +4015,6 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
		return -EPERM;
	}

	down_write(&(bonding_rwsem));
	slave_dev = dev_get_by_name(&init_net, ifr->ifr_slave);

	pr_debug("slave_dev=%p: \n", slave_dev);
@@ -4048,7 +4047,6 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
		dev_put(slave_dev);
	}

	up_write(&(bonding_rwsem));
	return res;
}

@@ -5123,8 +5121,6 @@ int bond_create(const char *name)
	int res;

	rtnl_lock();
	down_write(&bonding_rwsem);

	/* Check to see if the bond already exists. */
	if (name) {
		list_for_each_entry(bond, &bond_dev_list, bond_list)
@@ -5173,24 +5169,20 @@ int bond_create(const char *name)
		goto out_bond;
	}

	up_write(&bonding_rwsem);
	rtnl_unlock(); /* allows sysfs registration of net device */
	res = bond_create_sysfs_entry(netdev_priv(bond_dev));
	if (res < 0)
		goto out_unreg;

	rtnl_unlock();
	return 0;

out_unreg:
	rtnl_lock();
	down_write(&bonding_rwsem);
	unregister_netdevice(bond_dev);
out_bond:
	bond_deinit(bond_dev);
out_netdev:
	free_netdev(bond_dev);
out_rtnl:
	up_write(&bonding_rwsem);
	rtnl_unlock();
	return res;
}
@@ -5209,8 +5201,6 @@ static int __init bonding_init(void)

	bond_create_proc_dir();

	init_rwsem(&bonding_rwsem);

	for (i = 0; i < max_bonds; i++) {
		res = bond_create(NULL);
		if (res)
+3 −20
Original line number Diff line number Diff line
@@ -44,20 +44,6 @@
/*---------------------------- Declarations -------------------------------*/

static int expected_refcount = -1;
/*--------------------------- Data Structures -----------------------------*/

/* Bonding sysfs lock.  Why can't we just use the subsystem lock?
 * Because kobject_register tries to acquire the subsystem lock.  If
 * we already hold the lock (which we would if the user was creating
 * a new bond through the sysfs interface), we deadlock.
 * This lock is only needed when deleting a bond - we need to make sure
 * that we don't collide with an ongoing ioctl.
 */

struct rw_semaphore bonding_rwsem;




/*------------------------------ Functions --------------------------------*/

@@ -70,7 +56,7 @@ static ssize_t bonding_show_bonds(struct class *cls, char *buf)
	int res = 0;
	struct bonding *bond;

	down_read(&(bonding_rwsem));
	rtnl_lock();

	list_for_each_entry(bond, &bond_dev_list, bond_list) {
		if (res > (PAGE_SIZE - IFNAMSIZ)) {
@@ -84,7 +70,8 @@ static ssize_t bonding_show_bonds(struct class *cls, char *buf)
	}
	if (res)
		buf[res-1] = '\n'; /* eat the leftover space */
	up_read(&(bonding_rwsem));

	rtnl_unlock();
	return res;
}

@@ -122,7 +109,6 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t

	if (command[0] == '-') {
		rtnl_lock();
		down_write(&bonding_rwsem);

		list_for_each_entry(bond, &bond_dev_list, bond_list)
			if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
@@ -157,7 +143,6 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
	return -EPERM;

out_unlock:
	up_write(&bonding_rwsem);
	rtnl_unlock();

	/* Always return either count or an error.  If you return 0, you'll
@@ -253,7 +238,6 @@ static ssize_t bonding_store_slaves(struct device *d,

	if (!rtnl_trylock())
		return restart_syscall();
	down_write(&(bonding_rwsem));

	sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
	ifname = command + 1;
@@ -357,7 +341,6 @@ static ssize_t bonding_store_slaves(struct device *d,
	ret = -EPERM;

out:
	up_write(&(bonding_rwsem));
	rtnl_unlock();
	return ret;
}
+0 −3
Original line number Diff line number Diff line
@@ -351,9 +351,6 @@ extern const struct bond_parm_tbl arp_validate_tbl[];
extern const struct bond_parm_tbl fail_over_mac_tbl[];
extern struct bond_parm_tbl ad_select_tbl[];

/* exported from bond_sysfs.c */
extern struct rw_semaphore bonding_rwsem;

#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
void bond_send_unsolicited_na(struct bonding *bond);
void bond_register_ipv6_notifier(void);