summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAndrew Morton <akpm@linux-foundation.org>2013-04-18 09:47:12 +1000
committerStephen Rothwell <sfr@canb.auug.org.au>2013-04-24 17:25:29 +1000
commit41310218c9ce23c03c38ab7e66ea5da2f57d769c (patch)
tree06fc0cb869efbb4dbbe53d49a4ba7e9872da5977 /kernel
parent193e23dc9ad22f2c25a961ed6a82b87b26e0df08 (diff)
resource-add-release_mem_region_adjustable-fix-fix
switch back to GFP_KERNEL, less buggily Cc: David Rientjes <rientjes@google.com> Cc: Jiang Liu <jiang.liu@huawei.com> Cc: Ram Pai <linuxram@us.ibm.com> Cc: T Makphaibulchoke <tmac@hp.com> Cc: Tang Chen <tangchen@cn.fujitsu.com> Cc: Toshi Kani <toshi.kani@hp.com> Cc: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/resource.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/kernel/resource.c b/kernel/resource.c
index c7ca8f323e6b..1c51cc64bcca 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -1046,7 +1046,8 @@ int release_mem_region_adjustable(struct resource *parent,
resource_size_t start, resource_size_t size)
{
struct resource **p;
- struct resource *res, *new;
+ struct resource *res;
+ struct resource *new_res;
resource_size_t end;
int ret = -EINVAL;
@@ -1054,6 +1055,9 @@ int release_mem_region_adjustable(struct resource *parent,
if ((start < parent->start) || (end > parent->end))
return ret;
+ /* The kzalloc() result gets checked later */
+ new_res = kzalloc(sizeof(struct resource), GFP_KERNEL);
+
p = &parent->child;
write_lock(&resource_lock);
@@ -1091,32 +1095,33 @@ int release_mem_region_adjustable(struct resource *parent,
start - res->start);
} else {
/* split into two entries */
- new = kzalloc(sizeof(struct resource), GFP_ATOMIC);
- if (!new) {
+ if (!new_res) {
ret = -ENOMEM;
break;
}
- new->name = res->name;
- new->start = end + 1;
- new->end = res->end;
- new->flags = res->flags;
- new->parent = res->parent;
- new->sibling = res->sibling;
- new->child = NULL;
+ new_res->name = res->name;
+ new_res->start = end + 1;
+ new_res->end = res->end;
+ new_res->flags = res->flags;
+ new_res->parent = res->parent;
+ new_res->sibling = res->sibling;
+ new_res->child = NULL;
ret = __adjust_resource(res, res->start,
start - res->start);
if (ret) {
- kfree(new);
+ kfree(new_res);
break;
}
- res->sibling = new;
+ res->sibling = new_res;
+ new_res = NULL;
}
break;
}
write_unlock(&resource_lock);
+ kfree(new_res);
return ret;
}
#endif /* CONFIG_MEMORY_HOTPLUG */