From: Hongchao Zhang Date: Thu, 5 Jul 2018 11:44:38 +0000 (-0400) Subject: LU-10683 osd_zfs: set offset in page correctly X-Git-Tag: 2.11.54~67 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=83cb17031913ba2f33a5b67219a03c5605f48f27;p=fs%2Flustre-release.git LU-10683 osd_zfs: set offset in page correctly 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 Reviewed-on: https://review.whamcloud.com/32788 Reviewed-by: Nathaniel Clark Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index fef00d7..5715f10 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -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;