From f5d57409e9d4bed5a7ba91c4c725596958a3b1a3 Mon Sep 17 00:00:00 2001 From: huanghua Date: Thu, 14 Sep 2006 10:29:10 +0000 Subject: [PATCH] (1) call mdt_shrink_reply() whenever possaible; (2) fix a bug in mdc_xxx_pack(): 32 bit integer to __u64 convertion --- lustre/mdc/mdc_internal.h | 4 ++-- lustre/mdc/mdc_lib.c | 4 ++-- lustre/mdd/mdd_handler.c | 11 ++++++++++- lustre/mdt/mdt_open.c | 45 +++++++++++++++++++++------------------------ lustre/mdt/mdt_reint.c | 5 +++-- 5 files changed, 38 insertions(+), 31 deletions(-) diff --git a/lustre/mdc/mdc_internal.h b/lustre/mdc/mdc_internal.h index 43dcc49..f85c873 100644 --- a/lustre/mdc/mdc_internal.h +++ b/lustre/mdc/mdc_internal.h @@ -33,7 +33,7 @@ void mdc_pack_req_body(struct ptlrpc_request *req, int offset, void mdc_pack_rep_body(struct ptlrpc_request *); void mdc_readdir_pack(struct ptlrpc_request *req, int pos, __u64 offset, __u32 size, const struct lu_fid *fid); -void mdc_getattr_pack(struct ptlrpc_request *req, int offset, int valid, +void mdc_getattr_pack(struct ptlrpc_request *req, int offset, __u64 valid, int flags, struct md_op_data *data); void mdc_setattr_pack(struct ptlrpc_request *req, int offset, struct md_op_data *op_data, @@ -56,7 +56,7 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset, struct md_op_data *op_data, const char *old, int oldlen, const char *new, int newlen); void mdc_close_pack(struct ptlrpc_request *req, int offset, struct md_op_data *op_data, - int valid, struct obd_client_handle *och); + __u64 valid, struct obd_client_handle *och); void mdc_exit_request(struct client_obd *cli); void mdc_enter_request(struct client_obd *cli); diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index e4d0f12..336abee 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -293,7 +293,7 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset, } } -void mdc_getattr_pack(struct ptlrpc_request *req, int offset, int valid, +void mdc_getattr_pack(struct ptlrpc_request *req, int offset, __u64 valid, int flags, struct md_op_data *op_data) { struct mdt_body *b; @@ -317,7 +317,7 @@ void mdc_getattr_pack(struct ptlrpc_request *req, int offset, int valid, } void mdc_close_pack(struct ptlrpc_request *req, int offset, - struct md_op_data *op_data, int valid, + struct md_op_data *op_data, __u64 valid, struct obd_client_handle *och) { struct mdt_body *body; diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index db5a13a..3c4ac7b 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -1646,7 +1646,16 @@ static int mdd_create_data(const struct lu_context *ctxt, /*XXX: setting the lov ea is not locked * but setting the attr is locked? */ - rc = mdd_lov_set_md(ctxt, mdd_pobj, son, lmm, lmm_size, handle, 0); + + /* replay creates has objects already */ + if (spec->u.sp_ea.no_lov_create) + rc = mdd_lov_set_md(ctxt, mdd_pobj, son, + (struct lov_mds_md *)spec->u.sp_ea.eadata, + spec->u.sp_ea.eadatalen, handle, 0); + else + rc = mdd_lov_set_md(ctxt, mdd_pobj, son, lmm, + lmm_size, handle, 0); + if (rc == 0) rc = mdd_attr_get_internal_locked(ctxt, son, ma); diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 6ba8fed..298617e 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -223,8 +223,6 @@ static int mdt_mfd_open(struct mdt_thread_info *info, LASSERT(ma->ma_valid & MA_INODE); repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); - repbody->eadatasize = 0; - repbody->aclsize = 0; isreg = S_ISREG(la->la_mode); isdir = S_ISDIR(la->la_mode); @@ -286,9 +284,6 @@ static int mdt_mfd_open(struct mdt_thread_info *info, else repbody->valid |= OBD_MD_FLEASIZE; } - /* FIXME: should determine the offset dynamicly, - * did not get ACL before shrink. */ - mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1); if (flags & FMODE_WRITE) { @@ -362,7 +357,14 @@ void mdt_reconstruct_open(struct mdt_thread_info *info) LASSERT(pill->rc_fmt == &RQF_LDLM_INTENT_OPEN); mdt_req_from_mcd(req, med->med_mcd); - mdt_set_disposition(info, ldlm_rep, le32_to_cpu(mcd->mcd_last_data)); + mdt_set_disposition(info, ldlm_rep, mcd->mcd_last_data); + + ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD); + ma->ma_lmm_size = mdt->mdt_max_mdsize; + ma->ma_need = MA_INODE | MA_LOV; + repbody = req_capsule_server_get(pill, &RMF_MDT_BODY); + repbody->eadatasize = 0; + repbody->aclsize = 0; if (mdt_get_disposition(ldlm_rep, DISP_OPEN_CREATE) && req->rq_status) { /* we did not create successfully, return error to client. */ @@ -397,13 +399,6 @@ void mdt_reconstruct_open(struct mdt_thread_info *info) if (IS_ERR(child)) GOTO(out_parent, result = PTR_ERR(child)); - ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD); - ma->ma_lmm_size = mdt->mdt_max_mdsize; - ma->ma_need = MA_INODE | MA_LOV; - repbody = req_capsule_server_get(pill, &RMF_MDT_BODY); - repbody->eadatasize = 0; - repbody->aclsize = 0; - result = mo_attr_get(ctxt, mdt_object_child(child), ma); if (result == -EREMOTE) { /* the object is on remote node @@ -453,7 +448,6 @@ void mdt_reconstruct_open(struct mdt_thread_info *info) else repbody->valid |= OBD_MD_FLEASIZE; } - mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1); if (flags & FMODE_WRITE) { /* FIXME: in recovery, need to pass old epoch here */ @@ -506,6 +500,7 @@ out_child: out_parent: mdt_object_put(ctxt, parent); out: + mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1); req->rq_status = result; } @@ -597,6 +592,7 @@ int mdt_open(struct mdt_thread_info *info) struct mdt_object *child; struct mdt_lock_handle *lh; struct ldlm_reply *ldlm_rep; + struct mdt_body *repbody; struct lu_fid *child_fid = &info->mti_tmp_fid1; struct md_attr *ma = &info->mti_attr; struct lu_attr *la = &ma->ma_attr; @@ -609,6 +605,10 @@ int mdt_open(struct mdt_thread_info *info) OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_PAUSE_OPEN | OBD_FAIL_ONCE, (obd_timeout + 1) / 4); + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + repbody->eadatasize = 0; + repbody->aclsize = 0; + ma->ma_lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD); ma->ma_lmm_size = mdt->mdt_max_mdsize; ma->ma_need = MA_INODE | MA_LOV; @@ -619,7 +619,7 @@ int mdt_open(struct mdt_thread_info *info) /* TODO: JOIN file */ if (create_flags & MDS_OPEN_JOIN_FILE) { CERROR("JOIN file will be supported soon\n"); - RETURN(-EOPNOTSUPP); + GOTO(out, result = -EOPNOTSUPP); } CDEBUG(D_INODE, "I am going to create "DFID"/("DFID":%s) " @@ -633,25 +633,26 @@ int mdt_open(struct mdt_thread_info *info) result = mdt_open_by_fid(info, ldlm_rep); if (result != -ENOENT) - RETURN(result); + GOTO(out, result); /* We didn't find the correct object, so we * need to re-create it via a regular replay. */ if (!(create_flags & MDS_OPEN_CREAT)) { DEBUG_REQ(D_ERROR, req,"OPEN_CREAT not in open replay"); - RETURN(-EFAULT); + GOTO(out, result = -EFAULT); } + CERROR("RRRRPPPPPP failed, continue to regular open\n"); } if (MDT_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK)) - RETURN(-ENOMEM); + GOTO(out, result = -ENOMEM); mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD); if (rr->rr_name[0] == 0) { /* this is cross-ref open */ mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); result = mdt_cross_open(info, rr->rr_fid1, ldlm_rep, create_flags); - RETURN(result); + GOTO(out, result); } lh = &info->mti_lh[MDT_LH_PARENT]; @@ -712,11 +713,6 @@ int mdt_open(struct mdt_thread_info *info) result = mo_attr_get(info->mti_ctxt, mdt_object_child(child), ma); if (result == -EREMOTE) { - struct mdt_body *repbody; - - repbody = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_BODY); - /* the object is on remote node * return its FID for remote open */ repbody->fid1 = *mdt_object_fid(child); @@ -744,6 +740,7 @@ out_child: out_parent: mdt_object_unlock_put(info, parent, lh, result); out: + mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1); return result; } diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 84c4b6c..a6a224e 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -238,7 +238,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info) rr->rr_name); if (MDT_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNLINK)) - RETURN(-ENOENT); + GOTO(out, rc = -ENOENT); /* step 1: lock the parent */ lhp = &info->mti_lh[MDT_LH_PARENT]; @@ -246,7 +246,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info) mp = mdt_object_find_lock(info, rr->rr_fid1, lhp, MDS_INODELOCK_UPDATE); if (IS_ERR(mp)) - RETURN(PTR_ERR(mp)); + GOTO(out, rc = PTR_ERR(mp)); if (strlen(rr->rr_name) == 0) { /* remote partial operation */ @@ -301,6 +301,7 @@ out_unlock_child: mdt_object_unlock_put(info, mc, lhc, rc); out_unlock_parent: mdt_object_unlock_put(info, mp, lhp, rc); +out: mdt_shrink_reply(info, REPLY_REC_OFF + 1); return rc; } -- 1.8.3.1