diff options
-rw-r--r-- | kernel/resource.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 46286434af80..9db38a1a7520 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -344,12 +344,11 @@ EXPORT_SYMBOL(allocate_resource); | |||
344 | * | 344 | * |
345 | * Returns 0 on success, -EBUSY if the resource can't be inserted. | 345 | * Returns 0 on success, -EBUSY if the resource can't be inserted. |
346 | * | 346 | * |
347 | * This function is equivalent of request_resource when no conflict | 347 | * This function is equivalent to request_resource when no conflict |
348 | * happens. If a conflict happens, and the conflicting resources | 348 | * happens. If a conflict happens, and the conflicting resources |
349 | * entirely fit within the range of the new resource, then the new | 349 | * entirely fit within the range of the new resource, then the new |
350 | * resource is inserted and the conflicting resources become childs of | 350 | * resource is inserted and the conflicting resources become children of |
351 | * the new resource. Otherwise the new resource becomes the child of | 351 | * the new resource. |
352 | * the conflicting resource | ||
353 | */ | 352 | */ |
354 | int insert_resource(struct resource *parent, struct resource *new) | 353 | int insert_resource(struct resource *parent, struct resource *new) |
355 | { | 354 | { |
@@ -357,20 +356,21 @@ int insert_resource(struct resource *parent, struct resource *new) | |||
357 | struct resource *first, *next; | 356 | struct resource *first, *next; |
358 | 357 | ||
359 | write_lock(&resource_lock); | 358 | write_lock(&resource_lock); |
360 | begin: | ||
361 | result = 0; | ||
362 | first = __request_resource(parent, new); | ||
363 | if (!first) | ||
364 | goto out; | ||
365 | 359 | ||
366 | result = -EBUSY; | 360 | for (;; parent = first) { |
367 | if (first == parent) | 361 | result = 0; |
368 | goto out; | 362 | first = __request_resource(parent, new); |
363 | if (!first) | ||
364 | goto out; | ||
369 | 365 | ||
370 | /* Resource fully contained by the clashing resource? Recurse into it */ | 366 | result = -EBUSY; |
371 | if (first->start <= new->start && first->end >= new->end) { | 367 | if (first == parent) |
372 | parent = first; | 368 | goto out; |
373 | goto begin; | 369 | |
370 | if ((first->start > new->start) || (first->end < new->end)) | ||
371 | break; | ||
372 | if ((first->start == new->start) && (first->end == new->end)) | ||
373 | break; | ||
374 | } | 374 | } |
375 | 375 | ||
376 | for (next = first; ; next = next->sibling) { | 376 | for (next = first; ; next = next->sibling) { |