diff options
author | Julia Lawall <julia@diku.dk> | 2010-08-04 21:54:26 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-08-31 11:40:35 -0700 |
commit | d1ae4da731a6e049a675097ebfd9a02b9b50530e (patch) | |
tree | 63326555cf48a30edf242d40088083ebe4752704 /drivers/staging/iio/magnetometer | |
parent | e3a92cdedf3584e20e13511aab252a82d715f927 (diff) | |
download | op-kernel-dev-d1ae4da731a6e049a675097ebfd9a02b9b50530e.zip op-kernel-dev-d1ae4da731a6e049a675097ebfd9a02b9b50530e.tar.gz |
drivers/staging/iio: call mutex_unlock in error handling code
Adjust the error handling code so that it benefits from the call to
mutex_unlock at the end of the function.
The semantic match that finds this problem is as follows:
(http://coccinelle.lip6.fr/)
// <smpl>
@rcu exists@
position p1;
expression E;
@@
mutex_lock@p1(E);
...
mutex_unlock(E);
@exists@
position rcu.p1;
expression E;
@@
*mutex_lock@p1(E);
... when != mutex_unlock(E);
?*return ...;
// </smpl>
Signed-off-by: Julia Lawall <julia@diku.dk>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/iio/magnetometer')
-rw-r--r-- | drivers/staging/iio/magnetometer/hmc5843.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index 92f6c6f..ea5f749 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c @@ -220,11 +220,15 @@ static ssize_t hmc5843_set_operating_mode(struct device *dev, int error; mutex_lock(&data->lock); error = strict_strtoul(buf, 10, &operating_mode); - if (error) - return error; + if (error) { + count = error; + goto exit; + } dev_dbg(dev, "set Conversion mode to %lu\n", operating_mode); - if (operating_mode > MODE_SLEEP) - return -EINVAL; + if (operating_mode > MODE_SLEEP) { + count = -EINVAL; + goto exit; + } status = i2c_smbus_write_byte_data(client, this_attr->address, operating_mode); @@ -437,18 +441,23 @@ static ssize_t set_range(struct device *dev, int error; mutex_lock(&data->lock); error = strict_strtoul(buf, 10, &range); - if (error) - return error; + if (error) { + count = error; + goto exit; + } dev_dbg(dev, "set range to %lu\n", range); - if (range > RANGE_6_5) - return -EINVAL; + if (range > RANGE_6_5) { + count = -EINVAL; + goto exit; + } data->range = range; range = range << RANGE_GAIN_OFFSET; if (i2c_smbus_write_byte_data(client, this_attr->address, range)) count = -EINVAL; +exit: mutex_unlock(&data->lock); return count; |