Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d0e81b7e2246a41d068ecaf15aac9de570816d63
Commit:     d0e81b7e2246a41d068ecaf15aac9de570816d63
Parent:     6603a6f25e4bca922a7dfbf0bf03072d98850176
Author:     Jay Vosburgh <[EMAIL PROTECTED]>
AuthorDate: Wed Oct 17 17:37:51 2007 -0700
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Tue Oct 23 20:32:01 2007 -0400

    bonding: Acquire correct locks in alb for promisc change
    
        Update ALB mode monitor to hold correct locks (RTNL and nothing
    else) when calling dev_set_promiscuity.
    
    Signed-off-by: Andy Gospodarek <[EMAIL PROTECTED]>
    Signed-off-by: Jay Vosburgh <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/net/bonding/bond_alb.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
index 6db5d76..25b8dbf 100644
--- a/drivers/net/bonding/bond_alb.c
+++ b/drivers/net/bonding/bond_alb.c
@@ -1455,16 +1455,16 @@ void bond_alb_monitor(struct work_struct *work)
 
        /* handle rlb stuff */
        if (bond_info->rlb_enabled) {
-               /* the following code changes the promiscuity of the
-                * the curr_active_slave. It needs to be locked with a
-                * write lock to protect from other code that also
-                * sets the promiscuity.
-                */
-               write_lock_bh(&bond->curr_slave_lock);
-
                if (bond_info->primary_is_promisc &&
                    (++bond_info->rlb_promisc_timeout_counter >= 
RLB_PROMISC_TIMEOUT)) {
 
+                       /*
+                        * dev_set_promiscuity requires rtnl and
+                        * nothing else.
+                        */
+                       read_unlock(&bond->lock);
+                       rtnl_lock();
+
                        bond_info->rlb_promisc_timeout_counter = 0;
 
                        /* If the primary was set to promiscuous mode
@@ -1473,9 +1473,10 @@ void bond_alb_monitor(struct work_struct *work)
                         */
                        dev_set_promiscuity(bond->curr_active_slave->dev, -1);
                        bond_info->primary_is_promisc = 0;
-               }
 
-               write_unlock_bh(&bond->curr_slave_lock);
+                       rtnl_unlock();
+                       read_lock(&bond->lock);
+               }
 
                if (bond_info->rlb_rebalance) {
                        bond_info->rlb_rebalance = 0;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to