diff options
author | Sang-Hun Lee <sanlee@nvidia.com> | 2014-05-17 18:32:13 -0700 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-05-28 05:13:16 -0700 |
commit | 940ba3f873878d0ac1cd5b73052058f7f57dcf04 (patch) | |
tree | 07e1d6298d19c82c72d9683ce0f378a70858f160 /drivers/i2c | |
parent | 5045ce20afca4a6bd6f56b1999ffd933bb78bd22 (diff) |
i2c: tegra: protect i2c state variables
- i2c state variables cancel_xfer_on_shutdown and
atomic_xfer_only are accessed without any locking,
which could lead to a race
- lock the adapter when accessing these variables
Bug 1510778
Change-Id: If4a69b1e85e3801616cf8f3da6938fca4b0ab816
Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com>
Reviewed-on: http://git-master/r/411129
Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com>
Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 2 | ||||
-rw-r--r-- | drivers/i2c/i2c-core.c | 6 |
2 files changed, 6 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 4081496bec24..fc0a0b11e09e 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -1236,7 +1236,7 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], struct tegra_i2c_dev *i2c_dev = i2c_get_adapdata(adap); int i; int ret = 0; - + BUG_ON(!rt_mutex_is_locked(&(adap->bus_lock))); if (i2c_dev->is_suspended) return -EBUSY; diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index a2940fa428f2..620690c97ece 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -619,8 +619,10 @@ EXPORT_SYMBOL_GPL(i2c_shutdown_adapter); void i2c_shutdown_clear_adapter(struct i2c_adapter *adapter) { + i2c_lock_adapter(adapter); adapter->cancel_xfer_on_shutdown = false; adapter->atomic_xfer_only = true; + i2c_unlock_adapter(adapter); } EXPORT_SYMBOL_GPL(i2c_shutdown_clear_adapter); @@ -1574,8 +1576,10 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) if (!adap->cancel_xfer_on_shutdown) ret = __i2c_transfer(adap, msgs, num); - else + else { + WARN_ON(1); ret = -EPERM; + } i2c_unlock_adapter(adap); return ret; |