Checking if the resource is already registered and adding to the list
must be atomic or bad things can happen.

Signed-off-by: Mike Chan <m...@android.com>
---
 arch/arm/plat-omap/resource.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/arch/arm/plat-omap/resource.c b/arch/arm/plat-omap/resource.c
index 111020a..4631912 100644
--- a/arch/arm/plat-omap/resource.c
+++ b/arch/arm/plat-omap/resource.c
@@ -255,6 +255,7 @@ int resource_refresh(void)
  */
 int resource_register(struct shared_resource *resp)
 {
+       int ret = 0;
        if (!resp)
                return -EINVAL;
 
@@ -262,12 +263,13 @@ int resource_register(struct shared_resource *resp)
                return -EINVAL;
 
        /* Verify that the resource is not already registered */
-       if (resource_lookup(resp->name))
-               return -EEXIST;
+       down(&res_mutex);
+       if (_resource_lookup(resp->name))
+               ret = -EEXIST;
+               goto out;
 
        INIT_LIST_HEAD(&resp->users_list);
 
-       down(&res_mutex);
        /* Add the resource to the resource list */
        list_add(&resp->node, &res_list);
 
@@ -275,10 +277,11 @@ int resource_register(struct shared_resource *resp)
        if (resp->ops->init)
                resp->ops->init(resp);
 
-       up(&res_mutex);
        pr_debug("resource: registered %s\n", resp->name);
 
-       return 0;
+out:
+       up(&res_mutex);
+       return ret;
 }
 EXPORT_SYMBOL(resource_register);
 
-- 
1.5.4.5

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to