From 1249edcd71e6a44f92aba1482201b30696e85d0d Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Mon, 24 Mar 2014 19:30:19 +0400 Subject: [PATCH] LU-4820 osd: drop memcpy in zfs osd dmu_read() was called from osd_read_prep() copying from ARC bufs into the same ARC bufs. seem to be the remainings of per-zerocopy age. Signed-off-by: Alex Zhuravlev Change-Id: I0f3657c360d8541d7c3c6e8e32eac78bc5702b42 Reviewed-on: http://review.whamcloud.com/9760 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Isaac Huang Reviewed-by: Oleg Drokin --- lustre/osd-zfs/osd_io.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index 284e886..829226b 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -721,25 +721,25 @@ static int osd_read_prep(const struct lu_env *env, struct dt_object *dt, struct niobuf_local *lnb, int npages) { struct osd_object *obj = osd_dt_obj(dt); - struct lu_buf buf; - loff_t offset; - int i; + loff_t size; + int i; LASSERT(dt_object_exists(dt)); LASSERT(obj->oo_db); + read_lock(&obj->oo_attr_lock); + size = obj->oo_attr.la_size; + read_unlock(&obj->oo_attr_lock); + for (i = 0; i < npages; i++) { - buf.lb_buf = kmap(lnb[i].lnb_page); - buf.lb_len = lnb[i].lnb_len; - offset = lnb[i].lnb_file_offset; + if (unlikely(lnb[i].lnb_rc < 0)) + continue; - CDEBUG(D_OTHER, "read %u bytes at %u\n", - (unsigned) lnb[i].lnb_len, - (unsigned) lnb[i].lnb_file_offset); - lnb[i].lnb_rc = osd_read(env, dt, &buf, &offset, NULL); - kunmap(lnb[i].lnb_page); + lnb[i].lnb_rc = lnb[i].lnb_len; + + if (lnb[i].lnb_file_offset + lnb[i].lnb_len > size) { + lnb[i].lnb_rc = size - lnb[i].lnb_file_offset; - if (lnb[i].lnb_rc < buf.lb_len) { /* all subsequent rc should be 0 */ while (++i < npages) lnb[i].lnb_rc = 0; -- 1.8.3.1