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 | ||
