From 87b0b99b4170d574299d6955d301a31e48a80ba0 Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Tue, 22 Dec 2009 15:02:22 -0800 Subject: [PATCH] --- yaml --- r: 180967 b: refs/heads/master c: 5eeec0ec931a01e85b3701ce121b7d8a1800ec60 h: refs/heads/master i: 180965: 0db8a8dad93d05f0a2ab50e62a7a20183682bb0f 180963: d5d1fa5434796224da5063ae55e705abd874b79a 180959: baed09b079e65a56130e92f543a1e092beb76f08 v: v3 --- [refs] | 2 +- trunk/include/linux/ioport.h | 1 + trunk/kernel/resource.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 957e24afa379..779ecf5e3cb7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7cc5997d1dada3bdeed95a59c2f4f6c66cbb0767 +refs/heads/master: 5eeec0ec931a01e85b3701ce121b7d8a1800ec60 diff --git a/trunk/include/linux/ioport.h b/trunk/include/linux/ioport.h index 4a811891dbe3..dda98410d588 100644 --- a/trunk/include/linux/ioport.h +++ b/trunk/include/linux/ioport.h @@ -112,6 +112,7 @@ extern struct resource iomem_resource; extern int request_resource(struct resource *root, struct resource *new); extern int release_resource(struct resource *new); +void release_child_resources(struct resource *new); extern void reserve_region_with_split(struct resource *root, resource_size_t start, resource_size_t end, const char *name); diff --git a/trunk/kernel/resource.c b/trunk/kernel/resource.c index 7fd123ad00aa..24e9e60c1459 100644 --- a/trunk/kernel/resource.c +++ b/trunk/kernel/resource.c @@ -188,6 +188,36 @@ static int __release_resource(struct resource *old) return -EINVAL; } +static void __release_child_resources(struct resource *r) +{ + struct resource *tmp, *p; + resource_size_t size; + + p = r->child; + r->child = NULL; + while (p) { + tmp = p; + p = p->sibling; + + tmp->parent = NULL; + tmp->sibling = NULL; + __release_child_resources(tmp); + + printk(KERN_DEBUG "release child resource %pR\n", tmp); + /* need to restore size, and keep flags */ + size = resource_size(tmp); + tmp->start = 0; + tmp->end = size - 1; + } +} + +void release_child_resources(struct resource *r) +{ + write_lock(&resource_lock); + __release_child_resources(r); + write_unlock(&resource_lock); +} + /** * request_resource - request and reserve an I/O or memory resource * @root: root resource descriptor