From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from [222.73.24.84] (helo=song.cn.fujitsu.com) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UcY8k-0003ie-1Z for kexec@lists.infradead.org; Wed, 15 May 2013 09:36:54 +0000 Message-ID: <5193564F.9090408@cn.fujitsu.com> Date: Wed, 15 May 2013 17:33:03 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 1/8] vmcore: clean up read_vmcore() References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090545.28109.86085.stgit@localhost6.localdomain6> In-Reply-To: <20130515090545.28109.86085.stgit@localhost6.localdomain6> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "kexec" Errors-To: kexec-bounces+dwmw2=twosheds.infradead.org@lists.infradead.org To: HATAYAMA Daisuke Cc: riel@redhat.com, hughd@google.com, jingbai.ma@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, lisa.mitchell@hp.com, linux-mm@kvack.org, kumagai-atsushi@mxc.nes.nec.co.jp, ebiederm@xmission.com, kosaki.motohiro@jp.fujitsu.com, akpm@linux-foundation.org, walken@google.com, cpw@sgi.com, vgoyal@redhat.com 5LqOIDIwMTPlubQwNeaciDE15pelIDE3OjA1LCBIQVRBWUFNQSBEYWlzdWtlIOWGmemBkzoKPiBS ZXdyaXRlIHBhcnQgb2YgcmVhZF92bWNvcmUoKSB0aGF0IHJlYWRzIG9iamVjdHMgaW4gdm1jb3Jl X2xpc3QgaW4gdGhlCj4gc2FtZSB3YXkgYXMgcGFydCByZWFkaW5nIEVMRiBoZWFkZXJzLCBieSB3 aGljaCBzb21lIGR1cGxpY2F0ZWQgYW5kCj4gcmVkdW5kYW50IGNvZGVzIGFyZSByZW1vdmVkLgo+ IAo+IFNpZ25lZC1vZmYtYnk6IEhBVEFZQU1BIERhaXN1a2UgPGQuaGF0YXlhbWFAanAuZnVqaXRz dS5jb20+Cj4gQWNrZWQtYnk6IFZpdmVrIEdveWFsIDx2Z295YWxAcmVkaGF0LmNvbT4KClRoaXMg Y2xlYW51cCByZWFsbHkgbWFrZXMgdGhlIGNvZGUgbW9yZSBjbGVhci4KCkp1c3Qgb25lIG1pbm9y IG5pdHBpY2sgYmVsb3cuCgpBY2tlZC1ieTogWmhhbmcgWWFuZmVpIDx6aGFuZ3lhbmZlaUBjbi5m dWppdHN1LmNvbT4KCj4gLS0tCj4gCj4gIGZzL3Byb2Mvdm1jb3JlLmMgfCAgIDY4ICsrKysrKysr KysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICAxIGZpbGVz IGNoYW5nZWQsIDIwIGluc2VydGlvbnMoKyksIDQ4IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1n aXQgYS9mcy9wcm9jL3ZtY29yZS5jIGIvZnMvcHJvYy92bWNvcmUuYwo+IGluZGV4IDE3ZjdlMDgu LmFiMGM5MmUgMTAwNjQ0Cj4gLS0tIGEvZnMvcHJvYy92bWNvcmUuYwo+ICsrKyBiL2ZzL3Byb2Mv dm1jb3JlLmMKPiBAQCAtMTE4LDI3ICsxMTgsNiBAQCBzdGF0aWMgc3NpemVfdCByZWFkX2Zyb21f b2xkbWVtKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAo+ICAJcmV0dXJuIHJlYWQ7Cj4gIH0KPiAg Cj4gLS8qIE1hcHMgdm1jb3JlIGZpbGUgb2Zmc2V0IHRvIHJlc3BlY3RpdmUgcGh5c2ljYWwgYWRk cmVzcyBpbiBtZW1yb3kuICovCj4gLXN0YXRpYyB1NjQgbWFwX29mZnNldF90b19wYWRkcihsb2Zm X3Qgb2Zmc2V0LCBzdHJ1Y3QgbGlzdF9oZWFkICp2Y19saXN0LAo+IC0JCQkJCXN0cnVjdCB2bWNv cmUgKiptX3B0cikKPiAtewo+IC0Jc3RydWN0IHZtY29yZSAqbTsKPiAtCXU2NCBwYWRkcjsKPiAt Cj4gLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sIHZjX2xpc3QsIGxpc3QpIHsKPiAtCQl1NjQgc3Rh cnQsIGVuZDsKPiAtCQlzdGFydCA9IG0tPm9mZnNldDsKPiAtCQllbmQgPSBtLT5vZmZzZXQgKyBt LT5zaXplIC0gMTsKPiAtCQlpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8PSBlbmQpIHsK PiAtCQkJcGFkZHIgPSBtLT5wYWRkciArIG9mZnNldCAtIHN0YXJ0Owo+IC0JCQkqbV9wdHIgPSBt Owo+IC0JCQlyZXR1cm4gcGFkZHI7Cj4gLQkJfQo+IC0JfQo+IC0JKm1fcHRyID0gTlVMTDsKPiAt CXJldHVybiAwOwo+IC19Cj4gLQo+ICAvKiBSZWFkIGZyb20gdGhlIEVMRiBoZWFkZXIgYW5kIHRo ZW4gdGhlIGNyYXNoIGR1bXAuIE9uIGVycm9yLCBuZWdhdGl2ZSB2YWx1ZSBpcwo+ICAgKiByZXR1 cm5lZCBvdGhlcndpc2UgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYXJlIHJldHVybmVkLgo+ICAgKi8K PiBAQCAtMTQ3LDggKzEyNiw4IEBAIHN0YXRpYyBzc2l6ZV90IHJlYWRfdm1jb3JlKHN0cnVjdCBm aWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAo+ICB7Cj4gIAlzc2l6ZV90IGFjYyA9IDAs IHRtcDsKPiAgCXNpemVfdCB0c3o7Cj4gLQl1NjQgc3RhcnQsIG5yX2J5dGVzOwo+IC0Jc3RydWN0 IHZtY29yZSAqY3Vycl9tID0gTlVMTDsKPiArCXU2NCBzdGFydDsKPiArCXN0cnVjdCB2bWNvcmUg Km0gPSBOVUxMOwo+ICAKPiAgCWlmIChidWZsZW4gPT0gMCB8fCAqZnBvcyA+PSB2bWNvcmVfc2l6 ZSkKPiAgCQlyZXR1cm4gMDsKPiBAQCAtMTc0LDMzICsxNTMsMjYgQEAgc3RhdGljIHNzaXplX3Qg cmVhZF92bWNvcmUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCj4gIAkJ CXJldHVybiBhY2M7Cj4gIAl9Cj4gIAo+IC0Jc3RhcnQgPSBtYXBfb2Zmc2V0X3RvX3BhZGRyKCpm cG9zLCAmdm1jb3JlX2xpc3QsICZjdXJyX20pOwo+IC0JaWYgKCFjdXJyX20pCj4gLSAgICAgICAg CXJldHVybiAtRUlOVkFMOwo+IC0KPiAtCXdoaWxlIChidWZsZW4pIHsKPiAtCQl0c3ogPSBtaW5f dChzaXplX3QsIGJ1ZmxlbiwgUEFHRV9TSVpFIC0gKHN0YXJ0ICYgflBBR0VfTUFTSykpOwo+IC0K PiAtCQkvKiBDYWxjdWxhdGUgbGVmdCBieXRlcyBpbiBjdXJyZW50IG1lbW9yeSBzZWdtZW50LiAq Lwo+IC0JCW5yX2J5dGVzID0gKGN1cnJfbS0+c2l6ZSAtIChzdGFydCAtIGN1cnJfbS0+cGFkZHIp KTsKPiAtCQlpZiAodHN6ID4gbnJfYnl0ZXMpCj4gLQkJCXRzeiA9IG5yX2J5dGVzOwo+IC0KPiAt CQl0bXAgPSByZWFkX2Zyb21fb2xkbWVtKGJ1ZmZlciwgdHN6LCAmc3RhcnQsIDEpOwo+IC0JCWlm ICh0bXAgPCAwKQo+IC0JCQlyZXR1cm4gdG1wOwo+IC0JCWJ1ZmxlbiAtPSB0c3o7Cj4gLQkJKmZw b3MgKz0gdHN6Owo+IC0JCWJ1ZmZlciArPSB0c3o7Cj4gLQkJYWNjICs9IHRzejsKPiAtCQlpZiAo c3RhcnQgPj0gKGN1cnJfbS0+cGFkZHIgKyBjdXJyX20tPnNpemUpKSB7Cj4gLQkJCWlmIChjdXJy X20tPmxpc3QubmV4dCA9PSAmdm1jb3JlX2xpc3QpCj4gLQkJCQlyZXR1cm4gYWNjOwkvKkVPRiov Cj4gLQkJCWN1cnJfbSA9IGxpc3RfZW50cnkoY3Vycl9tLT5saXN0Lm5leHQsCj4gLQkJCQkJCXN0 cnVjdCB2bWNvcmUsIGxpc3QpOwo+IC0JCQlzdGFydCA9IGN1cnJfbS0+cGFkZHI7Cj4gKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5KG0sICZ2bWNvcmVfbGlzdCwgbGlzdCkgewo+ICsJCWlmICgqZnBvcyA8 IG0tPm9mZnNldCArIG0tPnNpemUpIHsKPiArCQkJdHN6ID0gbS0+b2Zmc2V0ICsgbS0+c2l6ZSAt ICpmcG9zOwo+ICsJCQlpZiAoYnVmbGVuIDwgdHN6KQo+ICsJCQkJdHN6ID0gYnVmbGVuOwoKaWYg KHRzeiA+IGJ1ZmxlbikKICAgICAgICB0c3ogPSBidWZsZW47CgpzZWVtcyBiZXR0ZXIuCgpPciB5 b3UgY2FuIHVzZSBhIG1pbl90IGhlcmU6Cgp0c3ogPSBtaW5fdChzaXplX3QsIG0tPm9mZnNldCAr IG0tPnNpemUgLSAqZnBvcywgYnVmbGVuKTsKCgo+ICsJCQlzdGFydCA9IG0tPnBhZGRyICsgKmZw b3MgLSBtLT5vZmZzZXQ7Cj4gKwkJCXRtcCA9IHJlYWRfZnJvbV9vbGRtZW0oYnVmZmVyLCB0c3os ICZzdGFydCwgMSk7Cj4gKwkJCWlmICh0bXAgPCAwKQo+ICsJCQkJcmV0dXJuIHRtcDsKPiArCQkJ YnVmbGVuIC09IHRzejsKPiArCQkJKmZwb3MgKz0gdHN6Owo+ICsJCQlidWZmZXIgKz0gdHN6Owo+ ICsJCQlhY2MgKz0gdHN6Owo+ICsKPiArCQkJLyogbGVhdmUgbm93IGlmIGZpbGxlZCBidWZmZXIg YWxyZWFkeSAqLwo+ICsJCQlpZiAoYnVmbGVuID09IDApCj4gKwkJCQlyZXR1cm4gYWNjOwo+ICAJ CX0KPiAgCX0KPiArCj4gIAlyZXR1cm4gYWNjOwo+ICB9Cj4gIAo+IAo+IAoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmtleGVjIG1haWxpbmcgbGlzdApr ZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxt YW4vbGlzdGluZm8va2V4ZWMK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx111.postini.com [74.125.245.111]) by kanga.kvack.org (Postfix) with SMTP id DFECF6B0002 for ; Wed, 15 May 2013 05:35:26 -0400 (EDT) Message-ID: <5193564F.9090408@cn.fujitsu.com> Date: Wed, 15 May 2013 17:33:03 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v6 1/8] vmcore: clean up read_vmcore() References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090545.28109.86085.stgit@localhost6.localdomain6> In-Reply-To: <20130515090545.28109.86085.stgit@localhost6.localdomain6> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Sender: owner-linux-mm@kvack.org List-ID: To: HATAYAMA Daisuke Cc: vgoyal@redhat.com, ebiederm@xmission.com, akpm@linux-foundation.org, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, jingbai.ma@hp.com, linux-mm@kvack.org, riel@redhat.com, walken@google.com, hughd@google.com, kosaki.motohiro@jp.fujitsu.com =E4=BA=8E 2013=E5=B9=B405=E6=9C=8815=E6=97=A5 17:05, HATAYAMA Daisuke =E5= =86=99=E9=81=93: > Rewrite part of read=5Fvmcore() that reads objects in vmcore=5Flist in the > same way as part reading ELF headers, by which some duplicated and > redundant codes are removed. >=20 > Signed-off-by: HATAYAMA Daisuke > Acked-by: Vivek Goyal This cleanup really makes the code more clear. Just one minor nitpick below. Acked-by: Zhang Yanfei > --- >=20 > fs/proc/vmcore.c | 68 ++++++++++++++++--------------------------------= ------ > 1 files changed, 20 insertions(+), 48 deletions(-) >=20 > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 17f7e08..ab0c92e 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -118,27 +118,6 @@ static ssize=5Ft read=5Ffrom=5Foldmem(char *buf, siz= e=5Ft count, > return read; > } > =20 > -/* Maps vmcore file offset to respective physical address in memroy. */ > -static u64 map=5Foffset=5Fto=5Fpaddr(loff=5Ft offset, struct list=5Fhead= *vc=5Flist, > - struct vmcore **m=5Fptr) > -{ > - struct vmcore *m; > - u64 paddr; > - > - list=5Ffor=5Feach=5Fentry(m, vc=5Flist, list) { > - u64 start, end; > - start =3D m->offset; > - end =3D m->offset + m->size - 1; > - if (offset >=3D start && offset <=3D end) { > - paddr =3D m->paddr + offset - start; > - *m=5Fptr =3D m; > - return paddr; > - } > - } > - *m=5Fptr =3D NULL; > - return 0; > -} > - > /* Read from the ELF header and then the crash dump. On error, negative = value is > * returned otherwise number of bytes read are returned. > */ > @@ -147,8 +126,8 @@ static ssize=5Ft read=5Fvmcore(struct file *file, cha= r =5F=5Fuser *buffer, > { > ssize=5Ft acc =3D 0, tmp; > size=5Ft tsz; > - u64 start, nr=5Fbytes; > - struct vmcore *curr=5Fm =3D NULL; > + u64 start; > + struct vmcore *m =3D NULL; > =20 > if (buflen =3D=3D 0 || *fpos >=3D vmcore=5Fsize) > return 0; > @@ -174,33 +153,26 @@ static ssize=5Ft read=5Fvmcore(struct file *file, c= har =5F=5Fuser *buffer, > return acc; > } > =20 > - start =3D map=5Foffset=5Fto=5Fpaddr(*fpos, &vmcore=5Flist, &curr=5Fm); > - if (!curr=5Fm) > - return -EINVAL; > - > - while (buflen) { > - tsz =3D min=5Ft(size=5Ft, buflen, PAGE=5FSIZE - (start & ~PAGE=5FMASK)= ); > - > - /* Calculate left bytes in current memory segment. */ > - nr=5Fbytes =3D (curr=5Fm->size - (start - curr=5Fm->paddr)); > - if (tsz > nr=5Fbytes) > - tsz =3D nr=5Fbytes; > - > - tmp =3D read=5Ffrom=5Foldmem(buffer, tsz, &start, 1); > - if (tmp < 0) > - return tmp; > - buflen -=3D tsz; > - *fpos +=3D tsz; > - buffer +=3D tsz; > - acc +=3D tsz; > - if (start >=3D (curr=5Fm->paddr + curr=5Fm->size)) { > - if (curr=5Fm->list.next =3D=3D &vmcore=5Flist) > - return acc; /*EOF*/ > - curr=5Fm =3D list=5Fentry(curr=5Fm->list.next, > - struct vmcore, list); > - start =3D curr=5Fm->paddr; > + list=5Ffor=5Feach=5Fentry(m, &vmcore=5Flist, list) { > + if (*fpos < m->offset + m->size) { > + tsz =3D m->offset + m->size - *fpos; > + if (buflen < tsz) > + tsz =3D buflen; if (tsz > buflen) tsz =3D buflen; seems better. Or you can use a min=5Ft here: tsz =3D min=5Ft(size=5Ft, m->offset + m->size - *fpos, buflen); > + start =3D m->paddr + *fpos - m->offset; > + tmp =3D read=5Ffrom=5Foldmem(buffer, tsz, &start, 1); > + if (tmp < 0) > + return tmp; > + buflen -=3D tsz; > + *fpos +=3D tsz; > + buffer +=3D tsz; > + acc +=3D tsz; > + > + /* leave now if filled buffer already */ > + if (buflen =3D=3D 0) > + return acc; > } > } > + > return acc; > } > =20 >=20 >=20 = -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758505Ab3EOJfe (ORCPT ); Wed, 15 May 2013 05:35:34 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:56762 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1754985Ab3EOJfd convert rfc822-to-8bit (ORCPT ); Wed, 15 May 2013 05:35:33 -0400 X-IronPort-AV: E=Sophos;i="4.87,677,1363104000"; d="scan'208";a="7275575" Message-ID: <5193564F.9090408@cn.fujitsu.com> Date: Wed, 15 May 2013 17:33:03 +0800 From: Zhang Yanfei User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.8) Gecko/20121012 Thunderbird/10.0.8 MIME-Version: 1.0 To: HATAYAMA Daisuke CC: vgoyal@redhat.com, ebiederm@xmission.com, akpm@linux-foundation.org, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, jingbai.ma@hp.com, linux-mm@kvack.org, riel@redhat.com, walken@google.com, hughd@google.com, kosaki.motohiro@jp.fujitsu.com Subject: Re: [PATCH v6 1/8] vmcore: clean up read_vmcore() References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090545.28109.86085.stgit@localhost6.localdomain6> In-Reply-To: <20130515090545.28109.86085.stgit@localhost6.localdomain6> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/15 17:34:14, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/15 17:34:16 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 于 2013年05月15日 17:05, HATAYAMA Daisuke 写道: > Rewrite part of read_vmcore() that reads objects in vmcore_list in the > same way as part reading ELF headers, by which some duplicated and > redundant codes are removed. > > Signed-off-by: HATAYAMA Daisuke > Acked-by: Vivek Goyal This cleanup really makes the code more clear. Just one minor nitpick below. Acked-by: Zhang Yanfei > --- > > fs/proc/vmcore.c | 68 ++++++++++++++++-------------------------------------- > 1 files changed, 20 insertions(+), 48 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 17f7e08..ab0c92e 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -118,27 +118,6 @@ static ssize_t read_from_oldmem(char *buf, size_t count, > return read; > } > > -/* Maps vmcore file offset to respective physical address in memroy. */ > -static u64 map_offset_to_paddr(loff_t offset, struct list_head *vc_list, > - struct vmcore **m_ptr) > -{ > - struct vmcore *m; > - u64 paddr; > - > - list_for_each_entry(m, vc_list, list) { > - u64 start, end; > - start = m->offset; > - end = m->offset + m->size - 1; > - if (offset >= start && offset <= end) { > - paddr = m->paddr + offset - start; > - *m_ptr = m; > - return paddr; > - } > - } > - *m_ptr = NULL; > - return 0; > -} > - > /* Read from the ELF header and then the crash dump. On error, negative value is > * returned otherwise number of bytes read are returned. > */ > @@ -147,8 +126,8 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, > { > ssize_t acc = 0, tmp; > size_t tsz; > - u64 start, nr_bytes; > - struct vmcore *curr_m = NULL; > + u64 start; > + struct vmcore *m = NULL; > > if (buflen == 0 || *fpos >= vmcore_size) > return 0; > @@ -174,33 +153,26 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, > return acc; > } > > - start = map_offset_to_paddr(*fpos, &vmcore_list, &curr_m); > - if (!curr_m) > - return -EINVAL; > - > - while (buflen) { > - tsz = min_t(size_t, buflen, PAGE_SIZE - (start & ~PAGE_MASK)); > - > - /* Calculate left bytes in current memory segment. */ > - nr_bytes = (curr_m->size - (start - curr_m->paddr)); > - if (tsz > nr_bytes) > - tsz = nr_bytes; > - > - tmp = read_from_oldmem(buffer, tsz, &start, 1); > - if (tmp < 0) > - return tmp; > - buflen -= tsz; > - *fpos += tsz; > - buffer += tsz; > - acc += tsz; > - if (start >= (curr_m->paddr + curr_m->size)) { > - if (curr_m->list.next == &vmcore_list) > - return acc; /*EOF*/ > - curr_m = list_entry(curr_m->list.next, > - struct vmcore, list); > - start = curr_m->paddr; > + list_for_each_entry(m, &vmcore_list, list) { > + if (*fpos < m->offset + m->size) { > + tsz = m->offset + m->size - *fpos; > + if (buflen < tsz) > + tsz = buflen; if (tsz > buflen) tsz = buflen; seems better. Or you can use a min_t here: tsz = min_t(size_t, m->offset + m->size - *fpos, buflen); > + 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; > + acc += tsz; > + > + /* leave now if filled buffer already */ > + if (buflen == 0) > + return acc; > } > } > + > return acc; > } > > >