diff options
-rw-r--r-- | kernel/resource.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index dc8b47764443..34d45886ee84 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -7,6 +7,8 @@ | |||
7 | * Arbitrary resource management. | 7 | * Arbitrary resource management. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
11 | |||
10 | #include <linux/export.h> | 12 | #include <linux/export.h> |
11 | #include <linux/errno.h> | 13 | #include <linux/errno.h> |
12 | #include <linux/ioport.h> | 14 | #include <linux/ioport.h> |
@@ -791,8 +793,28 @@ void __init reserve_region_with_split(struct resource *root, | |||
791 | resource_size_t start, resource_size_t end, | 793 | resource_size_t start, resource_size_t end, |
792 | const char *name) | 794 | const char *name) |
793 | { | 795 | { |
796 | int abort = 0; | ||
797 | |||
794 | write_lock(&resource_lock); | 798 | write_lock(&resource_lock); |
795 | __reserve_region_with_split(root, start, end, name); | 799 | if (root->start > start || root->end < end) { |
800 | pr_err("requested range [0x%llx-0x%llx] not in root %pr\n", | ||
801 | (unsigned long long)start, (unsigned long long)end, | ||
802 | root); | ||
803 | if (start > root->end || end < root->start) | ||
804 | abort = 1; | ||
805 | else { | ||
806 | if (end > root->end) | ||
807 | end = root->end; | ||
808 | if (start < root->start) | ||
809 | start = root->start; | ||
810 | pr_err("fixing request to [0x%llx-0x%llx]\n", | ||
811 | (unsigned long long)start, | ||
812 | (unsigned long long)end); | ||
813 | } | ||
814 | dump_stack(); | ||
815 | } | ||
816 | if (!abort) | ||
817 | __reserve_region_with_split(root, start, end, name); | ||
796 | write_unlock(&resource_lock); | 818 | write_unlock(&resource_lock); |
797 | } | 819 | } |
798 | 820 | ||