From f0ff8fa3d8c6612b11004f01068ab590b11fc290 Mon Sep 17 00:00:00 2001 From: Di Wang Date: Tue, 10 Nov 2015 02:12:00 -0800 Subject: [PATCH] LU-7414 target: do not share update and rdbuf Redefine lu_rdbuf structure to simplify the rdbuf allocation in out_read(). And also move tti_u.rdbuf out of tgt_thread_info union, otherwise rdbuf and update will share the same memory and cause corruption, see out_read(). Signed-off-by: Di Wang Change-Id: Idb0f5af1b00fd5fd15ebc8742aa60d9a43df0a8a Reviewed-on: http://review.whamcloud.com/17129 Tested-by: Jenkins Reviewed-by: John L. Hammond Reviewed-by: Andreas Dilger Tested-by: Maloo --- lustre/include/lu_object.h | 19 +++++++++---------- lustre/target/out_handler.c | 30 +++++++++++++----------------- lustre/target/tgt_handler.c | 6 +++--- lustre/target/tgt_internal.h | 7 +------ 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index 12fee04..69e8abb 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -905,16 +905,6 @@ struct lu_rdpg { struct page **rp_pages; }; -/* read buffer params, should be filled out by out */ -struct lu_rdbuf { - /** count in bytes */ - unsigned int rb_bytes; - /** number of pages */ - unsigned int rb_nbufs; - /** pointers to pages */ - struct lu_buf **rb_bufs; -}; - enum lu_xattr_flags { LU_XATTR_REPLACE = (1 << 0), LU_XATTR_CREATE = (1 << 1) @@ -1349,6 +1339,15 @@ struct lu_buf { #define DLUBUF "(%p %zu)" #define PLUBUF(buf) (buf)->lb_buf, (buf)->lb_len + +/* read buffer params, should be filled out by out */ +struct lu_rdbuf { + /** number of buffers */ + unsigned int rb_nbufs; + /** pointers to buffers */ + struct lu_buf rb_bufs[]; +}; + /** * One-time initializers, called at obdclass module initialization, not * exported. diff --git a/lustre/target/out_handler.c b/lustre/target/out_handler.c index 5d771a7..b38e1eb 100644 --- a/lustre/target/out_handler.c +++ b/lustre/target/out_handler.c @@ -599,7 +599,7 @@ static int out_read(struct tgt_session_info *tsi) struct dt_object *obj = tti->tti_u.update.tti_dt_object; struct object_update_reply *reply = tti->tti_u.update.tti_update_reply; int index = tti->tti_u.update.tti_update_reply_index; - struct lu_rdbuf *rdbuf = &tti->tti_u.rdbuf.tti_rdbuf; + struct lu_rdbuf *rdbuf; struct object_update_result *update_result; struct out_read_reply *orr; void *tmp; @@ -638,8 +638,9 @@ static int out_read(struct tgt_session_info *tsi) orr = (struct out_read_reply *)update_result->our_data; nbufs = (size + OUT_BULK_BUFFER_SIZE - 1) / OUT_BULK_BUFFER_SIZE; - OBD_ALLOC(rdbuf->rb_bufs, nbufs * sizeof(rdbuf->rb_bufs[0])); - if (rdbuf->rb_bufs == NULL) + OBD_ALLOC(rdbuf, sizeof(struct lu_rdbuf) + + nbufs * sizeof(rdbuf->rb_bufs[0])); + if (rdbuf == NULL) GOTO(out, rc = -ENOMEM); rdbuf->rb_nbufs = 0; @@ -647,19 +648,15 @@ static int out_read(struct tgt_session_info *tsi) for (i = 0; i < nbufs; i++) { __u32 read_size; - OBD_ALLOC_PTR(rdbuf->rb_bufs[i]); - if (rdbuf->rb_bufs[i] == NULL) - GOTO(out_free, rc = -ENOMEM); - read_size = size > OUT_BULK_BUFFER_SIZE ? OUT_BULK_BUFFER_SIZE : size; - OBD_ALLOC(rdbuf->rb_bufs[i]->lb_buf, read_size); - if (rdbuf->rb_bufs[i] == NULL) + OBD_ALLOC(rdbuf->rb_bufs[i].lb_buf, read_size); + if (rdbuf->rb_bufs[i].lb_buf == NULL) GOTO(out_free, rc = -ENOMEM); - rdbuf->rb_bufs[i]->lb_len = read_size; + rdbuf->rb_bufs[i].lb_len = read_size; dt_read_lock(env, obj, MOR_TGT_CHILD); - rc = dt_read(env, obj, rdbuf->rb_bufs[i], &pos); + rc = dt_read(env, obj, &rdbuf->rb_bufs[i], &pos); dt_read_unlock(env, obj); total_size += rc < 0 ? 0 : rc; @@ -670,7 +667,6 @@ static int out_read(struct tgt_session_info *tsi) size -= read_size; } - rdbuf->rb_bytes = total_size; /* send pages to client */ rc = tgt_send_buffer(tsi, rdbuf); if (rc < 0) @@ -683,13 +679,13 @@ static int out_read(struct tgt_session_info *tsi) update_result->our_datalen += orr->orr_size; out_free: for (i = 0; i < nbufs; i++) { - if (rdbuf->rb_bufs[i] != NULL) { - OBD_FREE(rdbuf->rb_bufs[i]->lb_buf, - rdbuf->rb_bufs[i]->lb_len); - OBD_FREE_PTR(rdbuf->rb_bufs[i]); + if (rdbuf->rb_bufs[i].lb_buf != NULL) { + OBD_FREE(rdbuf->rb_bufs[i].lb_buf, + rdbuf->rb_bufs[i].lb_len); } } - OBD_FREE(rdbuf->rb_bufs, nbufs * sizeof(rdbuf->rb_bufs[0])); + OBD_FREE(rdbuf, sizeof(struct lu_rdbuf) + + nbufs * sizeof(rdbuf->rb_bufs[0])); out: /* Insert read buffer */ update_result->our_rc = ptlrpc_status_hton(rc); diff --git a/lustre/target/tgt_handler.c b/lustre/target/tgt_handler.c index 80de14a3..e65269f 100644 --- a/lustre/target/tgt_handler.c +++ b/lustre/target/tgt_handler.c @@ -1078,7 +1078,7 @@ int tgt_send_buffer(struct tgt_session_info *tsi, struct lu_rdbuf *rdbuf) struct ptlrpc_request *req = tgt_ses_req(tsi); struct obd_export *exp = req->rq_export; struct ptlrpc_bulk_desc *desc; - struct l_wait_info *lwi = &tti->tti_u.rdbuf.tti_wait_info; + struct l_wait_info *lwi = &tti->tti_u.update.tti_wait_info; int i; int rc; @@ -1092,8 +1092,8 @@ int tgt_send_buffer(struct tgt_session_info *tsi, struct lu_rdbuf *rdbuf) for (i = 0; i < rdbuf->rb_nbufs; i++) desc->bd_frag_ops->add_iov_frag(desc, - rdbuf->rb_bufs[i]->lb_buf, - rdbuf->rb_bufs[i]->lb_len); + rdbuf->rb_bufs[i].lb_buf, + rdbuf->rb_bufs[i].lb_len); rc = target_bulk_io(exp, desc, lwi); ptlrpc_free_bulk(desc); diff --git a/lustre/target/tgt_internal.h b/lustre/target/tgt_internal.h index 9a1aeb3..824a9c7 100644 --- a/lustre/target/tgt_internal.h +++ b/lustre/target/tgt_internal.h @@ -77,18 +77,13 @@ struct tgt_thread_info { struct l_wait_info tti_wait_info; } rdpg; struct { - /* for out_read() */ - struct lu_rdbuf tti_rdbuf; - /* for tgt_sendpage() */ - struct l_wait_info tti_wait_info; - } rdbuf; - struct { struct dt_object_format tti_update_dof; struct object_update_reply *tti_update_reply; struct object_update *tti_update; int tti_update_reply_index; struct obdo tti_obdo; struct dt_object *tti_dt_object; + struct l_wait_info tti_wait_info; } update; } tti_u; struct lfsck_request tti_lr; -- 1.8.3.1