bonding: fix set mode race conditions
Changing the mode without any locking can result in multiple races (e.g. upping a bond, enslaving/releasing). Depending on which race is hit the impact can vary from incosistent bond state to kernel crash. Use RTNL to synchronize the mode setting with the dangerous races. Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ff0102ee10
commit
ea6836dd7e
|
@ -316,6 +316,9 @@ static ssize_t bonding_store_mode(struct device *d,
|
|||
int new_value, ret = count;
|
||||
struct bonding *bond = to_bond(d);
|
||||
|
||||
if (!rtnl_trylock())
|
||||
return restart_syscall();
|
||||
|
||||
if (bond->dev->flags & IFF_UP) {
|
||||
pr_err("unable to update mode of %s because interface is up.\n",
|
||||
bond->dev->name);
|
||||
|
@ -352,6 +355,7 @@ static ssize_t bonding_store_mode(struct device *d,
|
|||
bond->dev->name, bond_mode_tbl[new_value].modename,
|
||||
new_value);
|
||||
out:
|
||||
rtnl_unlock();
|
||||
return ret;
|
||||
}
|
||||
static DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
|
||||
|
|
Loading…
Reference in New Issue