From 686a73ea9467c53d261cf12d0802bb1332d50f4a Mon Sep 17 00:00:00 2001 From: Hongchao Zhang Date: Thu, 5 Jul 2018 07:44:38 -0400 Subject: [PATCH] LU-10683 osd_zfs: set offset in page correctly In osd_bufs_get_write, the offset in the first page should Lustre-change the offset parameter instead of zero. Lustre-change: https://review.whamcloud.com/32788 Lustre-commit: 83cb17031913ba2f33a5b67219a03c5605f48f27 Change-Id: I6592d8b5b0162b92953d59e2662a4381ba3e89ba Signed-off-by: Hongchao Zhang Reviewed-by: Nathaniel Clark Reviewed-by: Mike Pershin Reviewed-by: Alex Zhuravlev Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/32899 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: John L. Hammond --- lustre/osd-zfs/osd_io.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index b13014d..38cc15f 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -424,7 +424,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; @@ -488,11 +488,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; -- 1.8.3.1