summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorAndrew Morton <akpm@linux-foundation.org>2013-06-07 10:07:51 +1000
committerStephen Rothwell <sfr@canb.auug.org.au>2013-06-07 15:42:13 +1000
commitcaf1e3a932f926c54b6325291542ec5d705dd2c8 (patch)
treed99a7abf518ec8f99ba91459619371046f83c948 /fs
parentf3758affdb6a51ea780a5ed5c455f1de49de631e (diff)
vmcore-support-mmap-on-proc-vmcore-fix
use min(), switch to conventional error-unwinding approach Cc: Atsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp> Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Lisa Mitchell <lisa.mitchell@hp.com> Cc: Vivek Goyal <vgoyal@redhat.com> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/proc/vmcore.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index 423796979640..0f6db5269d38 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -218,9 +218,7 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
if (start < elfcorebuf_sz) {
u64 pfn;
- tsz = elfcorebuf_sz - start;
- if (size < tsz)
- tsz = size;
+ tsz = min(elfcorebuf_sz - (size_t)start, size);
pfn = __pa(elfcorebuf + start) >> PAGE_SHIFT;
if (remap_pfn_range(vma, vma->vm_start, pfn, tsz,
vma->vm_page_prot))
@@ -236,15 +234,11 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
if (start < elfcorebuf_sz + elfnotes_sz) {
void *kaddr;
- tsz = elfcorebuf_sz + elfnotes_sz - start;
- if (size < tsz)
- tsz = size;
+ tsz = min(elfcorebuf_sz + elfnotes_sz - (size_t)start, size);
kaddr = elfnotes_buf + start - elfcorebuf_sz;
if (remap_vmalloc_range_partial(vma, vma->vm_start + len,
- kaddr, tsz)) {
- do_munmap(vma->vm_mm, vma->vm_start, len);
- return -EAGAIN;
- }
+ kaddr, tsz))
+ goto fail;
size -= tsz;
start += tsz;
len += tsz;
@@ -257,16 +251,12 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
if (start < m->offset + m->size) {
u64 paddr = 0;
- tsz = m->offset + m->size - start;
- if (size < tsz)
- tsz = size;
+ tsz = min_t(size_t, m->offset + m->size - start, size);
paddr = m->paddr + start - m->offset;
if (remap_pfn_range(vma, vma->vm_start + len,
paddr >> PAGE_SHIFT, tsz,
- vma->vm_page_prot)) {
- do_munmap(vma->vm_mm, vma->vm_start, len);
- return -EAGAIN;
- }
+ vma->vm_page_prot))
+ goto fail;
size -= tsz;
start += tsz;
len += tsz;
@@ -277,6 +267,9 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma)
}
return 0;
+fail:
+ do_munmap(vma->vm_mm, vma->vm_start, len);
+ return -EAGAIN;
}
static const struct file_operations proc_vmcore_operations = {