From 9cda61a26bb1f2e70ac7ee9b583edf43201228cd Mon Sep 17 00:00:00 2001 From: Liang Zhen Date: Thu, 24 Apr 2014 20:19:53 +0800 Subject: [PATCH] LU-4952 osd: wrong paramters for dmu_tx_hold_write osd_declare_write_commit may pass wrong parameters to dmu_tx_hold_write when there are multiple IO fragments. Signed-off-by: Liang Zhen Change-Id: Ic7bd5ce1f42e7777c1a07eb4b9d19f8477da66a0 Reviewed-on: http://review.whamcloud.com/10079 Tested-by: Jenkins Reviewed-by: Alex Zhuravlev Reviewed-by: Johann Lombardi Tested-by: Maloo Reviewed-by: Isaac Huang --- lustre/osd-zfs/osd_io.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index b315807..98e359e 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -585,20 +585,21 @@ static int osd_declare_write_commit(const struct lu_env *env, continue; } - dmu_tx_hold_write(oh->ot_tx, obj->oo_db->db_object, offset,size); - + dmu_tx_hold_write(oh->ot_tx, obj->oo_db->db_object, + offset, size); /* estimating space that will be consumed by a write is rather * complicated with ZFS. As a consequence, we don't account for * indirect blocks and quota overrun will be adjusted once the * operation is committed, if required. */ space += osd_count_not_mapped(obj, offset, size); - offset = lnb->lnb_file_offset; - size = lnb->len; + offset = lnb[i].lnb_file_offset; + size = lnb[i].len; } if (size) { - dmu_tx_hold_write(oh->ot_tx, obj->oo_db->db_object, offset,size); + dmu_tx_hold_write(oh->ot_tx, obj->oo_db->db_object, + offset, size); space += osd_count_not_mapped(obj, offset, size); } -- 1.8.3.1