Whamcloud - gitweb
LU-10683 osd_zfs: set offset in page correctly 88/32788/2
authorHongchao Zhang <hongchao@whamcloud.com>
Thu, 5 Jul 2018 11:44:38 +0000 (07:44 -0400)
committerOleg Drokin <green@whamcloud.com>
Tue, 24 Jul 2018 15:59:31 +0000 (15:59 +0000)
In osd_bufs_get_write, the offset in the first page should
be calculated on the offset parameter instead of zero.

Change-Id: I6592d8b5b0162b92953d59e2662a4381ba3e89ba
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/32788
Reviewed-by: Nathaniel Clark <nclark@whamcloud.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-zfs/osd_io.c

index fef00d7..5715f10 100644 (file)
@@ -447,7 +447,7 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj,
                              loff_t off, ssize_t len, struct niobuf_local *lnb)
 {
        struct osd_device *osd = osd_obj2dev(obj);
-       int                plen, off_in_block, sz_in_block;
+       int                poff, plen, off_in_block, sz_in_block;
        int                rc, i = 0, npages = 0;
        dnode_t *dn = obj->oo_dn;
        arc_buf_t *abuf;
@@ -511,11 +511,16 @@ static int osd_bufs_get_write(const struct lu_env *env, struct osd_object *obj,
                                                LPROC_OSD_TAIL_IO, 1);
 
                        /* can't use zerocopy, allocate temp. buffers */
+                       poff = off & (PAGE_SIZE - 1);
                        while (sz_in_block > 0) {
-                               plen = min_t(int, sz_in_block, PAGE_SIZE);
+                               plen = min_t(int, poff + sz_in_block,
+                                            PAGE_SIZE);
+                               plen -= poff;
 
                                lnb[i].lnb_file_offset = off;
-                               lnb[i].lnb_page_offset = 0;
+                               lnb[i].lnb_page_offset = poff;
+                               poff = 0;
+
                                lnb[i].lnb_len = plen;
                                lnb[i].lnb_rc = 0;
                                lnb[i].lnb_data = NULL;