If flag MEM_TYPE_CURRENT_KERNEL is set, the object is copied in the buffer on the 2nd kernel, then read_vmcore() reads the buffer. If the flag is not set, read_vmcore() reads old memory as usual. Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com> --- fs/proc/vmcore.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index 09b7f34..c8899dc 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -158,10 +158,17 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, tsz = m->offset + m->size - *fpos; if (buflen < tsz) tsz = buflen; - start = m->paddr + *fpos - m->offset; - tmp = read_from_oldmem(buffer, tsz, &start, 1); - if (tmp < 0) - return tmp; + if (m->flag & MEM_TYPE_CURRENT_KERNEL) { + if (copy_to_user(buffer, + m->buf + *fpos - m->offset, + tsz)) + return -EFAULT; + } else { + start = m->paddr + *fpos - m->offset; + tmp = read_from_oldmem(buffer, tsz, &start, 1); + if (tmp < 0) + return tmp; + } buflen -= tsz; *fpos += tsz; buffer += tsz;