533
533
struct resource *parent = root;
534
534
struct resource *conflict;
535
535
struct resource *res = kzalloc(sizeof(*res), GFP_ATOMIC);
536
struct resource *next_res = NULL;
543
544
res->flags = IORESOURCE_BUSY;
545
conflict = __request_resource(parent, res);
549
/* failed, split and try again */
552
/* conflict covered whole area */
553
if (conflict->start <= start && conflict->end >= end)
556
if (conflict->start > start)
557
__reserve_region_with_split(root, start, conflict->start-1, name);
558
if (conflict->end < end)
559
__reserve_region_with_split(root, conflict->end+1, end, name);
548
conflict = __request_resource(parent, res);
557
/* conflict covered whole area */
558
if (conflict->start <= res->start &&
559
conflict->end >= res->end) {
565
/* failed, split and try again */
566
if (conflict->start > res->start) {
568
res->end = conflict->start - 1;
569
if (conflict->end < end) {
570
next_res = kzalloc(sizeof(*next_res),
576
next_res->name = name;
577
next_res->start = conflict->end + 1;
579
next_res->flags = IORESOURCE_BUSY;
582
res->start = conflict->end + 1;
562
588
void __init reserve_region_with_split(struct resource *root,