The operation done in the pmbus_update_fan() function is a
read-modify-write operation but it lacks any kind of lock protection
which may cause problems if run more than once simultaneously. This
patch uses an existing update_lock mutex to fix this problem.

Signed-off-by: Krzysztof Adamski <krzysztof.adam...@nokia.com>
---
 drivers/hwmon/pmbus/pmbus_core.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index ef7ee90ee785..94adbede7912 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -268,6 +268,7 @@ int pmbus_update_fan(struct i2c_client *client, int page, 
int id,
        int rv;
        u8 to;
 
+       mutex_lock(&data->update_lock);
        from = pmbus_read_byte_data(client, page,
                                    pmbus_fan_config_registers[id]);
        if (from < 0)
@@ -278,11 +279,15 @@ int pmbus_update_fan(struct i2c_client *client, int page, 
int id,
                rv = pmbus_write_byte_data(client, page,
                                           pmbus_fan_config_registers[id], to);
                if (rv < 0)
-                       return rv;
+                       goto out;
        }
 
-       return _pmbus_write_word_data(client, page,
-                                     pmbus_fan_command_registers[id], command);
+       rv = _pmbus_write_word_data(client, page,
+                                   pmbus_fan_command_registers[id], command);
+
+out:
+       mutex_lock(&data->update_lock);
+       return rv;
 }
 EXPORT_SYMBOL_GPL(pmbus_update_fan);
 
-- 
2.20.1

Reply via email to