lkml.org 
[lkml]   [2010]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] drivers/staging/iio: call mutex_unlock in error handling code
On 08/04/10 20:54, Julia Lawall wrote:
> From: Julia Lawall <julia@diku.dk>
Youch bad reviewing on my part.

Had a quick look and I think you caught all instances of this...

Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
>
> 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>
>
> ---
> 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;
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/



\
 
 \ /
  Last update: 2010-08-04 22:21    [W:0.055 / U:0.084 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site