Whamcloud - gitweb
LU-4820 osd: drop memcpy in zfs osd 60/9760/10
authorAlex Zhuravlev <alexey.zhuravlev@intel.com>
Mon, 24 Mar 2014 15:30:19 +0000 (19:30 +0400)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 4 Dec 2014 02:29:03 +0000 (02:29 +0000)
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 <alexey.zhuravlev@intel.com>
Change-Id: I0f3657c360d8541d7c3c6e8e32eac78bc5702b42
Reviewed-on: http://review.whamcloud.com/9760
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Isaac Huang <he.huang@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-zfs/osd_io.c

index 284e886..829226b 100644 (file)
@@ -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 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);
 
 
        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++) {
        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;
                        /* all subsequent rc should be 0 */
                        while (++i < npages)
                                lnb[i].lnb_rc = 0;