diff options
Diffstat (limited to 'kernel/kexec.c')
-rw-r--r-- | kernel/kexec.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c index 474a84715eac..c0613f7d6730 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -151,8 +151,10 @@ static int do_kimage_alloc(struct kimage **rimage, unsigned long entry, | |||
151 | image->nr_segments = nr_segments; | 151 | image->nr_segments = nr_segments; |
152 | segment_bytes = nr_segments * sizeof(*segments); | 152 | segment_bytes = nr_segments * sizeof(*segments); |
153 | result = copy_from_user(image->segment, segments, segment_bytes); | 153 | result = copy_from_user(image->segment, segments, segment_bytes); |
154 | if (result) | 154 | if (result) { |
155 | result = -EFAULT; | ||
155 | goto out; | 156 | goto out; |
157 | } | ||
156 | 158 | ||
157 | /* | 159 | /* |
158 | * Verify we have good destination addresses. The caller is | 160 | * Verify we have good destination addresses. The caller is |
@@ -827,7 +829,7 @@ static int kimage_load_normal_segment(struct kimage *image, | |||
827 | result = copy_from_user(ptr, buf, uchunk); | 829 | result = copy_from_user(ptr, buf, uchunk); |
828 | kunmap(page); | 830 | kunmap(page); |
829 | if (result) { | 831 | if (result) { |
830 | result = (result < 0) ? result : -EIO; | 832 | result = -EFAULT; |
831 | goto out; | 833 | goto out; |
832 | } | 834 | } |
833 | ubytes -= uchunk; | 835 | ubytes -= uchunk; |
@@ -882,7 +884,7 @@ static int kimage_load_crash_segment(struct kimage *image, | |||
882 | kexec_flush_icache_page(page); | 884 | kexec_flush_icache_page(page); |
883 | kunmap(page); | 885 | kunmap(page); |
884 | if (result) { | 886 | if (result) { |
885 | result = (result < 0) ? result : -EIO; | 887 | result = -EFAULT; |
886 | goto out; | 888 | goto out; |
887 | } | 889 | } |
888 | ubytes -= uchunk; | 890 | ubytes -= uchunk; |
@@ -1089,9 +1091,10 @@ void crash_kexec(struct pt_regs *regs) | |||
1089 | 1091 | ||
1090 | size_t crash_get_memory_size(void) | 1092 | size_t crash_get_memory_size(void) |
1091 | { | 1093 | { |
1092 | size_t size; | 1094 | size_t size = 0; |
1093 | mutex_lock(&kexec_mutex); | 1095 | mutex_lock(&kexec_mutex); |
1094 | size = crashk_res.end - crashk_res.start + 1; | 1096 | if (crashk_res.end != crashk_res.start) |
1097 | size = crashk_res.end - crashk_res.start + 1; | ||
1095 | mutex_unlock(&kexec_mutex); | 1098 | mutex_unlock(&kexec_mutex); |
1096 | return size; | 1099 | return size; |
1097 | } | 1100 | } |
@@ -1134,7 +1137,7 @@ int crash_shrink_memory(unsigned long new_size) | |||
1134 | 1137 | ||
1135 | free_reserved_phys_range(end, crashk_res.end); | 1138 | free_reserved_phys_range(end, crashk_res.end); |
1136 | 1139 | ||
1137 | if (start == end) | 1140 | if ((start == end) && (crashk_res.parent != NULL)) |
1138 | release_resource(&crashk_res); | 1141 | release_resource(&crashk_res); |
1139 | crashk_res.end = end - 1; | 1142 | crashk_res.end = end - 1; |
1140 | 1143 | ||