bonding: primary_slave & curr_active_slave are not cleaned on enslave failure
authornikolay@redhat.com <nikolay@redhat.com>
Thu, 18 Apr 2013 07:33:36 +0000 (07:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Apr 2013 21:48:19 +0000 (17:48 -0400)
On enslave failure primary_slave can point to new_slave which is to be
freed, and the same applies to curr_active_slave. So check if this is
the case and clean up properly after err_detach because that's the first
error code path after they're set.

Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bonding/bond_main.c

index dd67c49070d7f372501a6b2b7bfd73931bdf3b5a..1137d5eac45099c54b63ef6f3d62ad39272ad39c 100644 (file)
@@ -1909,7 +1909,17 @@ err_detach:
        bond_del_vlans_from_slave(bond, slave_dev);
        write_lock_bh(&bond->lock);
        bond_detach_slave(bond, new_slave);
+       if (bond->primary_slave == new_slave)
+               bond->primary_slave = NULL;
        write_unlock_bh(&bond->lock);
+       if (bond->curr_active_slave == new_slave) {
+               read_lock(&bond->lock);
+               write_lock_bh(&bond->curr_slave_lock);
+               bond_change_active_slave(bond, NULL);
+               bond_select_active_slave(bond);
+               write_unlock_bh(&bond->curr_slave_lock);
+               read_unlock(&bond->lock);
+       }
 
 err_close:
        slave_dev->priv_flags &= ~IFF_BONDING;