summaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding/bond_main.c
diff options
context:
space:
mode:
authorOr Gerlitz2008-06-14 03:12:02 +0200
committerJeff Garzik2008-06-18 05:59:42 +0200
commit01f3109de49a889db8adf9116449727547ee497e (patch)
tree5c35e4c7b39c9e652549a69b7c635edb96e1d68e /drivers/net/bonding/bond_main.c
parentbonding: bond_change_active_slave() cleanup under active-backup (diff)
downloadkernel-qcow2-linux-01f3109de49a889db8adf9116449727547ee497e.tar.gz
kernel-qcow2-linux-01f3109de49a889db8adf9116449727547ee497e.tar.xz
kernel-qcow2-linux-01f3109de49a889db8adf9116449727547ee497e.zip
bonding: deliver netdev event for fail-over under the active-backup mode
under active-backup mode and when there's actual new_active slave, have bond_change_active_slave() call the networking core to deliver NETDEV_BONDING_FAILOVER event such that the fail-over can be notable by code outside of the bonding driver such as the RDMA stack and monitoring tools. As the correct context of locking appropriate for notifier calls is RTNL and nothing else, bond->curr_slave_lock and bond->lock are unlocked and later locked again. This is ensured by the rest of the code to be safe under backup-mode AND when new_active is not NULL. Jay Vosburgh modified the original patch for formatting and fixed a compiler error. Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r--drivers/net/bonding/bond_main.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 2db2d057ccd0..925402bcdf4d 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1203,6 +1203,14 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
dprintk("delaying gratuitous arp on %s\n",
bond->curr_active_slave->dev->name);
}
+
+ write_unlock_bh(&bond->curr_slave_lock);
+ read_unlock(&bond->lock);
+
+ netdev_bonding_change(bond->dev);
+
+ read_lock(&bond->lock);
+ write_lock_bh(&bond->curr_slave_lock);
}
}
}