• Nikolay Aleksandrov's avatar
    bonding: fix a div error caused by the slave release path · ee6154e1
    Nikolay Aleksandrov authored
    There's a bug in the slave release function which leads the transmit
    functions which use the bond->slave_cnt to a div by 0 because we might
    just have released our last slave and made slave_cnt == 0 but at the same
    time we may have a transmitter after the check for an empty list which will
    fetch it and use it in the slave id calculation.
    Fix it by moving the slave_cnt after synchronize_rcu so if this was our
    last slave any new transmitters will see an empty slave list which is
    checked after rcu lock but before calling the mode transmit functions
    which rely on bond->slave_cnt.
    
    Fixes: 278b2083
    
     ("bonding: initial RCU conversion")
    
    CC: Veaceslav Falico <vfalico@redhat.com>
    CC: Andy Gospodarek <andy@greyhouse.net>
    CC: Jay Vosburgh <fubar@us.ibm.com>
    CC: David S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarNikolay Aleksandrov <nikolay@redhat.com>
    Acked-by: default avatarVeaceslav Falico <vfalico@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ee6154e1