bonding: fix __get_first_agg RCU usage
Currently, the RCU read lock usage is just wrong - it gets the slave struct
under RCU and continues to use it when RCU lock is released.
However, it's still safe to do this cause we didn't need the
rcu_read_lock() initially - all of the __get_first_agg() callers are either
holding RCU read lock or the RTNL lock, so that we can't sync while in it.
Fixes: be79bd048
("bonding: add RCU for bond_3ad_state_machine_handler()")
CC: dingtianhong@huawei.com
CC: Jay Vosburgh <fubar@us.ibm.com>
CC: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c1bc9644ec
commit
768b954922
@ -143,11 +143,13 @@ static inline struct bonding *__get_bond_by_port(struct port *port)
|
|||||||
*
|
*
|
||||||
* Return the aggregator of the first slave in @bond, or %NULL if it can't be
|
* Return the aggregator of the first slave in @bond, or %NULL if it can't be
|
||||||
* found.
|
* found.
|
||||||
|
* The caller must hold RCU or RTNL lock.
|
||||||
*/
|
*/
|
||||||
static inline struct aggregator *__get_first_agg(struct port *port)
|
static inline struct aggregator *__get_first_agg(struct port *port)
|
||||||
{
|
{
|
||||||
struct bonding *bond = __get_bond_by_port(port);
|
struct bonding *bond = __get_bond_by_port(port);
|
||||||
struct slave *first_slave;
|
struct slave *first_slave;
|
||||||
|
struct aggregator *agg;
|
||||||
|
|
||||||
/* If there's no bond for this port, or bond has no slaves */
|
/* If there's no bond for this port, or bond has no slaves */
|
||||||
if (bond == NULL)
|
if (bond == NULL)
|
||||||
@ -155,9 +157,10 @@ static inline struct aggregator *__get_first_agg(struct port *port)
|
|||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
first_slave = bond_first_slave_rcu(bond);
|
first_slave = bond_first_slave_rcu(bond);
|
||||||
|
agg = first_slave ? &(SLAVE_AD_INFO(first_slave).aggregator) : NULL;
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
return first_slave ? &(SLAVE_AD_INFO(first_slave).aggregator) : NULL;
|
return agg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user