mirror of
https://github.com/torvalds/linux.git
synced 2024-12-13 06:32:50 +00:00
bonding: bond_slave_info_query() fix
bond_slave_info_query() should keep a read lock while accessing slave info, or risk accessing stale data and corruption. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
00b64f2aa5
commit
689c96cca7
@ -2213,33 +2213,24 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in
|
|||||||
{
|
{
|
||||||
struct bonding *bond = netdev_priv(bond_dev);
|
struct bonding *bond = netdev_priv(bond_dev);
|
||||||
struct slave *slave;
|
struct slave *slave;
|
||||||
int i, found = 0;
|
int i, res = -ENODEV;
|
||||||
|
|
||||||
if (info->slave_id < 0) {
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
read_lock(&bond->lock);
|
read_lock(&bond->lock);
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, i) {
|
bond_for_each_slave(bond, slave, i) {
|
||||||
if (i == (int)info->slave_id) {
|
if (i == (int)info->slave_id) {
|
||||||
found = 1;
|
res = 0;
|
||||||
|
strcpy(info->slave_name, slave->dev->name);
|
||||||
|
info->link = slave->link;
|
||||||
|
info->state = slave->state;
|
||||||
|
info->link_failure_count = slave->link_failure_count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
read_unlock(&bond->lock);
|
read_unlock(&bond->lock);
|
||||||
|
|
||||||
if (found) {
|
return res;
|
||||||
strcpy(info->slave_name, slave->dev->name);
|
|
||||||
info->link = slave->link;
|
|
||||||
info->state = slave->state;
|
|
||||||
info->link_failure_count = slave->link_failure_count;
|
|
||||||
} else {
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------- Monitoring -------------------------------*/
|
/*-------------------------------- Monitoring -------------------------------*/
|
||||||
|
Loading…
Reference in New Issue
Block a user