[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <4C59CBA9.1030808@jic23.retrosnub.co.uk>
Date: Wed, 04 Aug 2010 21:20:57 +0100
From: Jonathan Cameron <kernel@...23.retrosnub.co.uk>
To: Julia Lawall <julia@...u.dk>
CC: Greg Kroah-Hartman <gregkh@...e.de>, devel@...verdev.osuosl.org,
linux-kernel@...r.kernel.org, kernel-janitors@...r.kernel.org
Subject: Re: [PATCH] drivers/staging/iio: call mutex_unlock in error handling
code
On 08/04/10 20:54, Julia Lawall wrote:
> From: Julia Lawall <julia@...u.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@....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@...u.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@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists