bonding: remove bonding read/write semaphore
authorStephen Hemminger <shemminger@vyatta.com>
Fri, 12 Jun 2009 19:02:46 +0000 (19:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 14 Jun 2009 06:28:54 +0000 (23:28 -0700)
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: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_sysfs.c
drivers/net/bonding/bonding.h

index 99ddd283e15ed22b56c0be83f3264d9d90c949d3..23b832ffe7a9f746610b6e31d1479bb4c9595c00 100644 (file)
@@ -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)
index 1172fe649352259df7667e9924fd92dd06510dd8..8041b67935327c11b45ee9458a45e6c62f8c5be9 100644 (file)
 /*---------------------------- 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 @@ err_no_cmd:
        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 @@ err_no_cmd:
        ret = -EPERM;
 
 out:
-       up_write(&(bonding_rwsem));
        rtnl_unlock();
        return ret;
 }
index a6efa0963717a6740a5f04c877abc39754e95442..af81e9b7fe34b21caf47520983525ce6d2661a1b 100644 (file)
@@ -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);