bonding: procfs: clean bond->lock usage and use RCU
authorNikolay Aleksandrov <[email protected]>
Tue, 9 Sep 2014 21:17:01 +0000 (23:17 +0200)
committerDavid S. Miller <[email protected]>
Wed, 10 Sep 2014 00:31:35 +0000 (17:31 -0700)
Use RCU to protect against slave release, the proc show function will sync
with the bond destruction by the proc locks and the fact that the bond is
released after NETDEV_UNREGISTER which causes the bonding to remove the
proc entry.

Signed-off-by: Nikolay Aleksandrov <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
drivers/net/bonding/bond_procfs.c

index 1a9fe1ba4c60e8953628d1d00a3036cb2f1168bf..bb09d0442aa88e0d7a989bf4594551f5d66bbee5 100644 (file)
@@ -7,21 +7,18 @@
 
 static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(RCU)
-       __acquires(&bond->lock)
 {
        struct bonding *bond = seq->private;
        struct list_head *iter;
        struct slave *slave;
        loff_t off = 0;
 
-       /* make sure the bond won't be taken away */
        rcu_read_lock();
-       read_lock(&bond->lock);
 
        if (*pos == 0)
                return SEQ_START_TOKEN;
 
-       bond_for_each_slave(bond, slave, iter)
+       bond_for_each_slave_rcu(bond, slave, iter)
                if (++off == *pos)
                        return slave;
 
@@ -37,12 +34,9 @@ static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
        ++*pos;
        if (v == SEQ_START_TOKEN)
-               return bond_first_slave(bond);
+               return bond_first_slave_rcu(bond);
 
-       if (bond_is_last_slave(bond, v))
-               return NULL;
-
-       bond_for_each_slave(bond, slave, iter) {
+       bond_for_each_slave_rcu(bond, slave, iter) {
                if (found)
                        return slave;
                if (slave == v)
@@ -53,12 +47,8 @@ static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 }
 
 static void bond_info_seq_stop(struct seq_file *seq, void *v)
-       __releases(&bond->lock)
        __releases(RCU)
 {
-       struct bonding *bond = seq->private;
-
-       read_unlock(&bond->lock);
        rcu_read_unlock();
 }