mirror of https://gitee.com/openkylin/linux.git
net/mlx4_core: Protect port type setting by mutex
We need to protect set_port_type() for concurrency, as the sysfs code could call it from mutliple contexts in parallel. The port_mutex is not enough because we need to protect from concurrent modification of 'info' and stopping of the port sensing work. Signed-off-by: Amir Vadai <amirv@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6e80669998
commit
0a98455666
|
@ -901,9 +901,12 @@ static ssize_t set_port_type(struct device *dev,
|
|||
struct mlx4_priv *priv = mlx4_priv(mdev);
|
||||
enum mlx4_port_type types[MLX4_MAX_PORTS];
|
||||
enum mlx4_port_type new_types[MLX4_MAX_PORTS];
|
||||
static DEFINE_MUTEX(set_port_type_mutex);
|
||||
int i;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&set_port_type_mutex);
|
||||
|
||||
if (!strcmp(buf, "ib\n"))
|
||||
info->tmp_type = MLX4_PORT_TYPE_IB;
|
||||
else if (!strcmp(buf, "eth\n"))
|
||||
|
@ -912,7 +915,8 @@ static ssize_t set_port_type(struct device *dev,
|
|||
info->tmp_type = MLX4_PORT_TYPE_AUTO;
|
||||
else {
|
||||
mlx4_err(mdev, "%s is not supported port type\n", buf);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
mlx4_stop_sense(mdev);
|
||||
|
@ -958,6 +962,9 @@ static ssize_t set_port_type(struct device *dev,
|
|||
out:
|
||||
mlx4_start_sense(mdev);
|
||||
mutex_unlock(&priv->port_mutex);
|
||||
err_out:
|
||||
mutex_unlock(&set_port_type_mutex);
|
||||
|
||||
return err ? err : count;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue