diff mbox

mtd: maps: add missing iounmap() in error path

Message ID 20161116225016.29958-1-henrix@camandro.org
State Changes Requested
Headers show

Commit Message

Luis Henriques Nov. 16, 2016, 10:50 p.m. UTC
This patch was triggered by the following Coccinelle error:

./drivers/mtd/maps/sc520cdp.c:246:3-9: \
	ERROR: missing iounmap; ioremap on line 242 \
	and execution via conditional on line 244

Signed-off-by: Luis Henriques <henrix@camandro.org>
---
 drivers/mtd/maps/sc520cdp.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Marek Vasut Nov. 20, 2016, 9:13 p.m. UTC | #1
On 11/16/2016 11:50 PM, Luis Henriques wrote:
> This patch was triggered by the following Coccinelle error:
> 
> ./drivers/mtd/maps/sc520cdp.c:246:3-9: \
> 	ERROR: missing iounmap; ioremap on line 242 \
> 	and execution via conditional on line 244
> 
> Signed-off-by: Luis Henriques <henrix@camandro.org>

Reviewed-by: Marek Vasut <marek.vasut@gmail.com>

> ---
>  drivers/mtd/maps/sc520cdp.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c
> index 093edd51bdc7..7a27ed345d0d 100644
> --- a/drivers/mtd/maps/sc520cdp.c
> +++ b/drivers/mtd/maps/sc520cdp.c
> @@ -243,6 +243,10 @@ static int __init init_sc520cdp(void)
>  
>  		if (!sc520cdp_map[i].virt) {
>  			printk("Failed to ioremap_nocache\n");
> +			if (i) {
> +				while (--i)
> +					iounmap(sc520cdp_map[i].virt);
> +			}
>  			return -EIO;
>  		}
>  
>
Brian Norris Nov. 22, 2016, 7:21 p.m. UTC | #2
On Wed, Nov 16, 2016 at 10:50:16PM +0000, Luis Henriques wrote:
> This patch was triggered by the following Coccinelle error:
> 
> ./drivers/mtd/maps/sc520cdp.c:246:3-9: \
> 	ERROR: missing iounmap; ioremap on line 242 \
> 	and execution via conditional on line 244
> 
> Signed-off-by: Luis Henriques <henrix@camandro.org>
> ---
>  drivers/mtd/maps/sc520cdp.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c
> index 093edd51bdc7..7a27ed345d0d 100644
> --- a/drivers/mtd/maps/sc520cdp.c
> +++ b/drivers/mtd/maps/sc520cdp.c
> @@ -243,6 +243,10 @@ static int __init init_sc520cdp(void)
>  
>  		if (!sc520cdp_map[i].virt) {
>  			printk("Failed to ioremap_nocache\n");
> +			if (i) {
> +				while (--i)

Umm, so you never unmap from sc520cdp_map[0].virt? How about:

				while (--i >= 0)

?

You can also skip the 'if (i)' part in that case. Or maybe make it a for
loop, to be even clearer.

> +					iounmap(sc520cdp_map[i].virt);

This may often be a double-iounmap. If you take a look later in the
loop, many instances of the loop may not find a device, and so they'll
unmap this memory and move on. You're just doing it a second time for
them.

> +			}
>  			return -EIO;
>  		}
>  

Please put some more care into your patch, since I very much expect that
you did not test it.

Brian
Luis Henriques Nov. 23, 2016, 3:22 p.m. UTC | #3
Brian Norris <computersforpeace@gmail.com> writes:

> On Wed, Nov 16, 2016 at 10:50:16PM +0000, Luis Henriques wrote:
>> This patch was triggered by the following Coccinelle error:
>> 
>> ./drivers/mtd/maps/sc520cdp.c:246:3-9: \
>> 	ERROR: missing iounmap; ioremap on line 242 \
>> 	and execution via conditional on line 244
>> 
>> Signed-off-by: Luis Henriques <henrix@camandro.org>
>> ---
>>  drivers/mtd/maps/sc520cdp.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>> 
>> diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c
>> index 093edd51bdc7..7a27ed345d0d 100644
>> --- a/drivers/mtd/maps/sc520cdp.c
>> +++ b/drivers/mtd/maps/sc520cdp.c
>> @@ -243,6 +243,10 @@ static int __init init_sc520cdp(void)
>>  
>>  		if (!sc520cdp_map[i].virt) {
>>  			printk("Failed to ioremap_nocache\n");
>> +			if (i) {
>> +				while (--i)
>
> Umm, so you never unmap from sc520cdp_map[0].virt? How about:
>
> 				while (--i >= 0)
>
> ?
>
> You can also skip the 'if (i)' part in that case. Or maybe make it a for
> loop, to be even clearer.
>
>> +					iounmap(sc520cdp_map[i].virt);
>
> This may often be a double-iounmap. If you take a look later in the
> loop, many instances of the loop may not find a device, and so they'll
> unmap this memory and move on. You're just doing it a second time for
> them.
>
>> +			}
>>  			return -EIO;
>>  		}
>>  
>
> Please put some more care into your patch, since I very much expect that
> you did not test it.
>
> Brian

Thank you very much for your review.  All very good points indeed!
I'll try to send v2 soon to cover all the issues you've found.

Cheers,
diff mbox

Patch

diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c
index 093edd51bdc7..7a27ed345d0d 100644
--- a/drivers/mtd/maps/sc520cdp.c
+++ b/drivers/mtd/maps/sc520cdp.c
@@ -243,6 +243,10 @@  static int __init init_sc520cdp(void)
 
 		if (!sc520cdp_map[i].virt) {
 			printk("Failed to ioremap_nocache\n");
+			if (i) {
+				while (--i)
+					iounmap(sc520cdp_map[i].virt);
+			}
 			return -EIO;
 		}