From: Adamski, Krzysztof (Nokia - PL/Wroclaw) Date: Wed, 29 May 2019 14:33:52 +0000 (+0000) Subject: hwmon: (pmbus/core) mutex_lock write in pmbus_set_samples X-Git-Tag: v5.2-rc4~13^2~1 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fkernel%2Flinux.git;a=commitdiff_plain;h=38463721ec3c39acdabed3a89016ce6bb32a7543 hwmon: (pmbus/core) mutex_lock write in pmbus_set_samples update_lock is a mutex intended to protect write operations. It was not taken, however, when _pmbus_write_word_data is called from pmbus_set_samples() function which may cause problems especially when some PMBUS_VIRT_* operation is implemented as a read-modify-write cycle. This patch makes sure the lock is held during the operation. Fixes: 49c4455dccf2 ("hwmon: (pmbus) Introduce PMBUS_VIRT_*_SAMPLES registers") Signed-off-by: Krzysztof Adamski Reviewed-by: Alexander Sverdlin [groeck: Declared and initialized missing 'data' variable] Signed-off-by: Guenter Roeck --- diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index ef7ee90ee785d..48c2d5ae42a6f 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c @@ -1942,11 +1942,14 @@ static ssize_t pmbus_set_samples(struct device *dev, long val; struct i2c_client *client = to_i2c_client(dev->parent); struct pmbus_samples_reg *reg = to_samples_reg(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); if (kstrtol(buf, 0, &val) < 0) return -EINVAL; + mutex_lock(&data->update_lock); ret = _pmbus_write_word_data(client, reg->page, reg->attr->reg, val); + mutex_unlock(&data->update_lock); return ret ? : count; }