From 24e4e22e200c06776910dc4e21d7a3217a031f60 Mon Sep 17 00:00:00 2001 From: huanghua Date: Wed, 30 Aug 2006 11:17:05 +0000 Subject: [PATCH] (1) store intent_disposition in mdt_thread_info, for mdt_update_last_rcvd to write to disk; (2) change req_capsule_has_field() to check server and client; (3) add some modules into module install scripts. --- lustre/include/lustre_req_layout.h | 6 +++-- lustre/mdt/mdt_handler.c | 49 +++++++++++++++++------------------ lustre/mdt/mdt_internal.h | 11 +++++++- lustre/mdt/mdt_lib.c | 9 ++++--- lustre/mdt/mdt_open.c | 18 ++++++------- lustre/mdt/mdt_recovery.c | 5 ++-- lustre/mdt/mdt_xattr.c | 2 +- lustre/ptlrpc/layout.c | 15 ++++++----- lustre/tests/test-framework.sh | 8 ++++++ lustre/utils/module_setup.sh | 52 ++++++++++++++++++++++---------------- 10 files changed, 103 insertions(+), 72 deletions(-) diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index 15bc66b..44b876f 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -77,9 +77,11 @@ int req_capsule_get_size(const struct req_capsule *pill, void req_capsule_extend(struct req_capsule *pill, const struct req_format *fmt); int req_capsule_has_field(const struct req_capsule *pill, - const struct req_msg_field *field); + const struct req_msg_field *field, + enum req_location loc); int req_capsule_field_present(const struct req_capsule *pill, - const struct req_msg_field *field); + const struct req_msg_field *field, + enum req_location loc); int req_layout_init(void); void req_layout_fini(void); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index bba781a..e8acce1 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -125,6 +125,22 @@ static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags); static struct lu_object_operations mdt_obj_ops; +int mdt_get_disposition(struct ldlm_reply *rep, int flag) +{ + if (!rep) + return 0; + return (rep->lock_policy_res1 & flag); +} + +void mdt_set_disposition(struct mdt_thread_info *info, + struct ldlm_reply *rep, int flag) +{ + if (info) + info->mti_opdata |= flag; + if (rep) + rep->lock_policy_res1 |= flag; +} + static int mdt_getstatus(struct mdt_thread_info *info) { @@ -366,10 +382,10 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, CDEBUG(D_INODE, "getattr with lock for "DFID"/%s, ldlm_rep = %p\n", PFID(mdt_object_fid(parent)), name, ldlm_rep); - intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD); if (strlen(name) == 0) { /* only getattr on the child. parent is on another node. */ - intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); child = parent; CDEBUG(D_INODE, "partial getattr_name child_fid = "DFID ", ldlm_rep=%p\n", @@ -398,10 +414,10 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, result = mdo_lookup(info->mti_ctxt, next, name, child_fid); if (result != 0) { if (result == -ENOENT) - intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_NEG); GOTO(out_parent, result); } else - intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); /* *step 3: find the child object by fid & lock it. * regardless if it is local or remote. @@ -1079,7 +1095,7 @@ static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags) ENTRY; pill = &info->mti_pill; - if (req_capsule_has_field(pill, &RMF_MDT_BODY)) + if (req_capsule_has_field(pill, &RMF_MDT_BODY, RCL_CLIENT)) result = mdt_body_unpack(info, flags); else result = 0; @@ -1427,21 +1443,6 @@ static int mdt_readpage_handle(struct ptlrpc_request *req) return mdt_handle_common(req, mdt_readpage_handlers); } -/*Please move these functions from mds to mdt*/ -int intent_disposition(struct ldlm_reply *rep, int flag) -{ - if (!rep) - return 0; - return (rep->lock_policy_res1 & flag); -} - -void intent_set_disposition(struct ldlm_reply *rep, int flag) -{ - if (!rep) - return; - rep->lock_policy_res1 |= flag; -} - enum mdt_it_code { MDT_IT_OPEN, MDT_IT_OCREAT, @@ -1561,15 +1562,15 @@ static int mdt_intent_getattr(enum mdt_it_code opcode, if (rc) RETURN(rc); ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); - intent_set_disposition(ldlm_rep, DISP_IT_EXECD); + mdt_set_disposition(info, ldlm_rep, DISP_IT_EXECD); ldlm_rep->lock_policy_res2 = mdt_getattr_name_lock(info, lhc, child_bits, ldlm_rep); mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1); - if (intent_disposition(ldlm_rep, DISP_LOOKUP_NEG)) + if (mdt_get_disposition(ldlm_rep, DISP_LOOKUP_NEG)) ldlm_rep->lock_policy_res2 = 0; - if (!intent_disposition(ldlm_rep, DISP_LOOKUP_POS) || + if (!mdt_get_disposition(ldlm_rep, DISP_LOOKUP_POS) || ldlm_rep->lock_policy_res2) { RETURN(ELDLM_LOCK_ABORTED); } @@ -1652,7 +1653,7 @@ static int mdt_intent_reint(enum mdt_it_code opcode, RETURN(-EFAULT); rep->lock_policy_res2 = rc; - intent_set_disposition(rep, DISP_IT_EXECD); + mdt_set_disposition(info, rep, DISP_IT_EXECD); mdt_finish_reply(info, rc); diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 3d5ac81..8d4929a 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -269,8 +269,13 @@ struct mdt_thread_info { __u64 mti_transno; __u32 mti_trans_flags; + /* opdata for mdt_open(), has the same as ldlm_reply:lock_policy_res1. + * mdt_update_last_rcvd() stores this value onto disk for recovery + * when mdt_trans_stop_cb() is called. + */ + __u64 mti_opdata; - /* temporary stuff used by thread to save stack comsuption. + /* temporary stuff used by thread to save stack consumption. * if something is in a union, make sure they do not conflict */ struct lu_fid mti_tmp_fid1; @@ -330,6 +335,10 @@ static inline const struct lu_fid *mdt_object_fid(struct mdt_object *o) return lu_object_fid(&o->mot_obj.mo_lu); } +int mdt_get_disposition(struct ldlm_reply *rep, int flag); +void mdt_set_disposition(struct mdt_thread_info *info, + struct ldlm_reply *rep, int flag); + int mdt_object_lock(struct mdt_thread_info *, struct mdt_object *, struct mdt_lock_handle *, diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index b0b41d23..630e255 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -189,13 +189,13 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info) la->la_mtime = rec->sa_mtime; ma->ma_valid = MA_INODE; - if (req_capsule_field_present(pill, &RMF_EADATA)) { + if (req_capsule_field_present(pill, &RMF_EADATA, RCL_CLIENT)) { ma->ma_lmm = req_capsule_client_get(pill, &RMF_EADATA); ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); ma->ma_valid |= MA_LOV; } - if (req_capsule_field_present(pill, &RMF_LOGCOOKIES)) { + if (req_capsule_field_present(pill, &RMF_LOGCOOKIES, RCL_CLIENT)) { ma->ma_cookie = req_capsule_client_get(pill, &RMF_LOGCOOKIES); ma->ma_cookie_size = req_capsule_get_size(pill, @@ -237,7 +237,8 @@ static int mdt_create_unpack(struct mdt_thread_info *info) info->mti_spec.u.sp_pfid = rr->rr_fid1; } else if (S_ISLNK(attr->la_mode)) { const char *tgt = NULL; - if (req_capsule_field_present(pill, &RMF_SYMTGT)) { + if (req_capsule_field_present(pill, &RMF_SYMTGT, + RCL_CLIENT)) { tgt = req_capsule_client_get(pill, &RMF_SYMTGT); info->mti_spec.u.sp_symname = tgt; @@ -363,7 +364,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info) } else result = -EFAULT; - if (req_capsule_field_present(pill, &RMF_EADATA)) { + if (req_capsule_field_present(pill, &RMF_EADATA, RCL_CLIENT)) { struct md_create_spec *sp = &info->mti_spec; sp->u.sp_ea.eadata = req_capsule_client_get(pill, &RMF_EADATA); diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 5eb92ba..ef8f804 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -212,7 +212,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, RETURN(0); } - intent_set_disposition(rep, DISP_OPEN_OPEN); + mdt_set_disposition(info, rep, DISP_OPEN_OPEN); /* we need to return the existing object's fid back, so it is done * here, after preparing the reply */ if (!created && (flags & MDS_OPEN_EXCL) && (flags & MDS_OPEN_CREAT)) @@ -337,9 +337,9 @@ static int mdt_open_by_fid(struct mdt_thread_info* info, else rc = PTR_ERR(th); if (rc == 0) { - intent_set_disposition(rep, DISP_LOOKUP_EXECD); - intent_set_disposition(rep, DISP_LOOKUP_POS); - intent_set_disposition(rep, DISP_OPEN_OPEN); + mdt_set_disposition(info, rep, DISP_LOOKUP_EXECD); + mdt_set_disposition(info, rep, DISP_LOOKUP_POS); + mdt_set_disposition(info, rep, DISP_OPEN_OPEN); rc = mdt_mfd_open(info, NULL, o, flags, 0, rep); } } @@ -468,10 +468,10 @@ int mdt_open(struct mdt_thread_info *info) if (MDT_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK)) RETURN(-ENOMEM); - intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD); if (rr->rr_name[0] == 0) { /* this is cross-ref open */ - intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); result = mdt_cross_open(info, rr->rr_fid1, ldlm_rep, create_flags); RETURN(result); } @@ -492,7 +492,7 @@ int mdt_open(struct mdt_thread_info *info) GOTO(out_parent, result); if (result == -ENOENT || result == -ESTALE) { - intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_NEG); if (result == -ESTALE) { /*ESTALE means the parent is a dead(unlinked) dir, *so it should return -ENOENT to in accordance @@ -504,7 +504,7 @@ int mdt_open(struct mdt_thread_info *info) *child_fid = *info->mti_rr.rr_fid2; /* new object will be created. see the following */ } else { - intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); /* check for O_EXCL is moved to the mdt_mfd_open, we need to * return FID back in that case */ } @@ -515,7 +515,7 @@ int mdt_open(struct mdt_thread_info *info) if (result == -ENOENT) { /* not found and with MDS_OPEN_CREAT: let's create it */ - intent_set_disposition(ldlm_rep, DISP_OPEN_CREATE); + mdt_set_disposition(info, ldlm_rep, DISP_OPEN_CREATE); result = mdo_create(info->mti_ctxt, mdt_object_child(parent), rr->rr_name, diff --git a/lustre/mdt/mdt_recovery.c b/lustre/mdt/mdt_recovery.c index 3cf8fb2..8557633 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -528,9 +528,8 @@ static int mdt_update_last_rcvd(struct mdt_thread_info *mti, mcd->mcd_last_result = cpu_to_le32(rc); /*XXX: save intent_disposition in mdt_thread_info? * also there is bug - intent_dispostion is __u64, - * see struct ldlm_reply->lock_policy_res1; - mcd->mcd_last_data = cpu_to_le32(op_data); - */ + * see struct ldlm_reply->lock_policy_res1; */ + mcd->mcd_last_data = cpu_to_le32(mti->mti_opdata); } if (off <= 0) { CERROR("client idx %d has offset %lld\n", med->med_lr_idx, off); diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index c8a7b70..694042d 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -210,7 +210,7 @@ int mdt_setxattr(struct mdt_thread_info *info) if ((valid & OBD_MD_FLXATTR) == OBD_MD_FLXATTR) { char * xattr; - if (!req_capsule_field_present(pill, &RMF_EADATA)) { + if (!req_capsule_field_present(pill, &RMF_EADATA, RCL_CLIENT)) { CERROR("no xattr data supplied\n"); GOTO(out_unlock, rc = -EFAULT); } diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index fb6e441..6c872ed 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -858,21 +858,24 @@ void req_capsule_extend(struct req_capsule *pill, const struct req_format *fmt) EXPORT_SYMBOL(req_capsule_extend); int req_capsule_has_field(const struct req_capsule *pill, - const struct req_msg_field *field) + const struct req_msg_field *field, + enum req_location loc) { - return field->rmf_offset[pill->rc_fmt->rf_idx][pill->rc_loc ^ 1]; + LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT); + + return field->rmf_offset[pill->rc_fmt->rf_idx][loc]; } EXPORT_SYMBOL(req_capsule_has_field); int req_capsule_field_present(const struct req_capsule *pill, - const struct req_msg_field *field) + const struct req_msg_field *field, + enum req_location loc) { - int loc; int offset; - LASSERT(req_capsule_has_field(pill, field)); + LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT); + LASSERT(req_capsule_has_field(pill, field, loc)); - loc = pill->rc_loc ^ 1; offset = __req_capsule_offset(pill, field, loc); return lustre_msg_bufcount(__req_msg(pill, loc)) > offset; } diff --git a/lustre/tests/test-framework.sh b/lustre/tests/test-framework.sh index 4474ace..8993b68 100644 --- a/lustre/tests/test-framework.sh +++ b/lustre/tests/test-framework.sh @@ -120,6 +120,14 @@ load_modules() { load_module llite/lustre load_module mgc/mgc load_module mgs/mgs + load_module quota/lquota + load_module quota/quotacheck_test + load_module quota/quotactl_test + load_module obdclass/llog_test + load_module obdecho/obdecho + load_module ldiskfs/quotafmt_test + + rm -f $TMP/ogdb-`hostname` $LCTL modules > $TMP/ogdb-`hostname` # 'mount' doesn't look in $PATH, just sbin diff --git a/lustre/utils/module_setup.sh b/lustre/utils/module_setup.sh index 5cddcf3..8d11978 100755 --- a/lustre/utils/module_setup.sh +++ b/lustre/utils/module_setup.sh @@ -17,30 +17,38 @@ fi echo "Copying modules from local build dir to "$MDIR -cp -u ../../lnet/libcfs/libcfs.$EXT $MDIR cp -u ../../lnet/lnet/lnet.$EXT $MDIR +cp -u ../../lnet/libcfs/libcfs.$EXT $MDIR cp -u ../../lnet/klnds/socklnd/ksocklnd.$EXT $MDIR -cp -u ../lvfs/lvfs.$EXT $MDIR -cp -u ../obdclass/obdclass.$EXT $MDIR -cp -u ../ptlrpc/ptlrpc.$EXT $MDIR -cp -u ../mdc/mdc.$EXT $MDIR -cp -u ../osc/osc.$EXT $MDIR -cp -u ../mdt/mdt.$EXT $MDIR -cp -u ../cmm/cmm.$EXT $MDIR -cp -u ../mdd/mdd.$EXT $MDIR -cp -u ../osd/osd.$EXT $MDIR -cp -u ../fld/fld.$EXT $MDIR -cp -u ../fid/fid.$EXT $MDIR -cp -u ../lmv/lmv.$EXT $MDIR -cp -u ../lov/lov.$EXT $MDIR -cp -u ../mds/mds.$EXT $MDIR -cp -u ../lvfs/$FSFLT.$EXT $MDIR -[ $KVER == "26" ] && cp -u ../ldiskfs/ldiskfs.$EXT $MDIR -cp -u ../ost/ost.$EXT $MDIR -cp -u ../obdfilter/obdfilter.$EXT $MDIR -cp -u ../llite/lustre.$EXT $MDIR -cp -u ../mgc/mgc.$EXT $MDIR -cp -u ../mgs/mgs.$EXT $MDIR +cp -u ../../lnet/tests/pingcli.$EXT $MDIR +cp -u ../../lnet/tests/pingsrv.$EXT $MDIR +cp -u ../../lustre/mgs/mgs.$EXT $MDIR +cp -u ../../lustre/quota/lquota.$EXT $MDIR +cp -u ../../lustre/quota/quotacheck_test.$EXT $MDIR +cp -u ../../lustre/quota/quotactl_test.$EXT $MDIR +cp -u ../../lustre/ptlrpc/ptlrpc.$EXT $MDIR +cp -u ../../lustre/fld/fld.$EXT $MDIR +cp -u ../../lustre/lov/lov.$EXT $MDIR +cp -u ../../lustre/mdc/mdc.$EXT $MDIR +cp -u ../../lustre/llite/lustre.$EXT $MDIR +cp -u ../../lustre/obdclass/llog_test.$EXT $MDIR +cp -u ../../lustre/obdclass/obdclass.$EXT $MDIR +cp -u ../../lustre/mdt/mdt.$EXT $MDIR +cp -u ../../lustre/fid/fid.$EXT $MDIR +cp -u ../../lustre/mds/mds.$EXT $MDIR +cp -u ../../lustre/osd/osd.$EXT $MDIR +cp -u ../../lustre/obdecho/obdecho.$EXT $MDIR +cp -u ../../lustre/obdfilter/obdfilter.$EXT $MDIR +cp -u ../../lustre/cmm/cmm.$EXT $MDIR +cp -u ../../lustre/ldiskfs/ldiskfs.$EXT $MDIR +cp -u ../../lustre/ldiskfs/quotafmt_test.$EXT $MDIR +cp -u ../../lustre/mdd/mdd.$EXT $MDIR +cp -u ../../lustre/osc/osc.$EXT $MDIR +cp -u ../../lustre/ost/ost.$EXT $MDIR +cp -u ../../lustre/mgc/mgc.$EXT $MDIR +cp -u ../../lustre/lvfs/fsfilt_ldiskfs.$EXT $MDIR +cp -u ../../lustre/lvfs/lvfs.$EXT $MDIR +cp -u ../../lustre/lmv/lmv.$EXT $MDIR # prevent warnings on my uml rm -f /lib/modules/`uname -r`/modules.* -- 1.8.3.1