Request_mem_region should be used with release_mem_region, not
release_resource.
A semantic patch that partially fixes this problem is as follows:
(http://coccinelle.lip6.fr/)
// <smpl>
@b@
expression x,E;
@@
x = request_mem_region(x->start,...)
... when != release_mem_region(x->start,...)
when != x = E
(
- release_resource(x);
- kfree(x);
+ release_mem_region(x->start,resource_size(x));
|
?- release_resource(x);
+ release_mem_region(x->start,resource_size(x));
)
// </smpl>
Signed-off-by: Julia Lawall <[email protected]>
---
drivers/mmc/host/mvsdio.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index a5bf60e..4606087 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -825,7 +825,7 @@ out:
iounmap(host->base);
}
if (r)
- release_resource(r);
+ release_mem_region(r->start, resource_size(r));
if (mmc)
mmc_free_host(mmc);
@@ -850,7 +850,7 @@ static int __exit mvsd_remove(struct platform_device *pdev)
del_timer_sync(&host->timer);
mvsd_power_down(host);
iounmap(host->base);
- release_resource(host->res);
+ release_mem_region(host->res->start, resource_size(host->res));
mmc_free_host(mmc);
}
platform_set_drvdata(pdev, NULL);
On Tue, 22 Mar 2011, Julia Lawall wrote:
> Request_mem_region should be used with release_mem_region, not
> release_resource.
>
> A semantic patch that partially fixes this problem is as follows:
> (http://coccinelle.lip6.fr/)
>
> // <smpl>
> @b@
> expression x,E;
> @@
>
> x = request_mem_region(x->start,...)
> ... when != release_mem_region(x->start,...)
> when != x = E
> (
> - release_resource(x);
> - kfree(x);
> + release_mem_region(x->start,resource_size(x));
> |
> ?- release_resource(x);
> + release_mem_region(x->start,resource_size(x));
> )
> // </smpl>
>
> Signed-off-by: Julia Lawall <[email protected]>
Acked-by: Nicolas Pitre <[email protected]>
> ---
> drivers/mmc/host/mvsdio.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
> index a5bf60e..4606087 100644
> --- a/drivers/mmc/host/mvsdio.c
> +++ b/drivers/mmc/host/mvsdio.c
> @@ -825,7 +825,7 @@ out:
> iounmap(host->base);
> }
> if (r)
> - release_resource(r);
> + release_mem_region(r->start, resource_size(r));
> if (mmc)
> mmc_free_host(mmc);
>
> @@ -850,7 +850,7 @@ static int __exit mvsd_remove(struct platform_device *pdev)
> del_timer_sync(&host->timer);
> mvsd_power_down(host);
> iounmap(host->base);
> - release_resource(host->res);
> + release_mem_region(host->res->start, resource_size(host->res));
> mmc_free_host(mmc);
> }
> platform_set_drvdata(pdev, NULL);
>