From 611b927fe53d94bc8fdec9afa22ed29c1af327c5 Mon Sep 17 00:00:00 2001 From: wangdi Date: Fri, 20 Oct 2006 07:30:41 +0000 Subject: [PATCH] Branch: b_new_cmd 1) move mdd credits to mdd device 2) compute unlink on lsm stripe count, not ost count. 3) refresh ma valid in mdt layer, before call cmm/mdd api --- lustre/mdd/mdd_dir.c | 20 +++--- lustre/mdd/mdd_handler.c | 35 ++++++++-- lustre/mdd/mdd_internal.h | 55 +++++++++------ lustre/mdd/mdd_lov.c | 4 -- lustre/mdd/mdd_lproc.c | 2 - lustre/mdd/mdd_object.c | 3 +- lustre/mdd/mdd_trans.c | 172 ++++++++++++++++------------------------------ lustre/mdt/mdt_handler.c | 5 +- lustre/mdt/mdt_open.c | 6 ++ lustre/mdt/mdt_reint.c | 8 ++- 10 files changed, 153 insertions(+), 157 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index f11d5d5..e4972af 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -379,7 +379,7 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, int rc; ENTRY; - mdd_txn_param_build(env, MDD_TXN_LINK_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_LINK_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -512,7 +512,10 @@ static int mdd_unlink(const struct lu_env *env, int rc, is_dir; ENTRY; - mdd_txn_param_build(env, MDD_TXN_UNLINK_OP); + rc = mdd_log_txn_param_build(env, mdd_cobj, ma, MDD_TXN_UNLINK_OP); + if (rc) + RETURN(rc); + handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -595,11 +598,12 @@ static int mdd_name_insert(const struct lu_env *env, int isdir) { struct mdd_object *mdd_obj = md2mdd_obj(pobj); + struct mdd_device *mdd = mdo2mdd(pobj); struct thandle *handle; int rc; ENTRY; - mdd_txn_param_build(env, MDD_TXN_INDEX_INSERT_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_INDEX_INSERT_OP); handle = mdd_trans_start(env, mdo2mdd(pobj)); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -657,7 +661,7 @@ static int mdd_name_remove(const struct lu_env *env, int rc; ENTRY; - mdd_txn_param_build(env, MDD_TXN_INDEX_DELETE_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_INDEX_DELETE_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -714,7 +718,7 @@ static int mdd_rename_tgt(const struct lu_env *env, int rc; ENTRY; - mdd_txn_param_build(env, MDD_TXN_RENAME_TGT_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_RENAME_TGT_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -802,7 +806,7 @@ static int mdd_create_data(const struct lu_env *env, if (rc) RETURN(rc); - mdd_txn_param_build(env, MDD_TXN_CREATE_DATA_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_CREATE_DATA_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(rc = PTR_ERR(handle)); @@ -1043,7 +1047,7 @@ static int mdd_create(const struct lu_env *env, RETURN(rc); } - mdd_txn_param_build(env, MDD_TXN_MKDIR_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_MKDIR_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -1263,7 +1267,7 @@ static int mdd_rename(const struct lu_env *env, if (tobj) mdd_tobj = md2mdd_obj(tobj); - mdd_txn_param_build(env, MDD_TXN_RENAME_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_RENAME_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index e40ed11..73738fa 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -112,6 +112,9 @@ int mdd_iattr_get(const struct lu_env *env, struct mdd_object *mdd_obj, int rc = 0; ENTRY; + if (ma->ma_valid & MA_INODE) + RETURN(0); + rc = mdd_la_get(env, mdd_obj, &ma->ma_attr, mdd_object_capa(env, mdd_obj)); if (rc == 0) @@ -126,6 +129,9 @@ static int __mdd_lmm_get(const struct lu_env *env, int rc; ENTRY; + if (ma->ma_valid & MA_LOV) + RETURN(0); + LASSERT(ma->ma_lmm != NULL && ma->ma_lmm_size > 0); rc = mdd_get_md(env, mdd_obj, ma->ma_lmm, &ma->ma_lmm_size, MDS_LOV_MD_NAME); @@ -136,12 +142,26 @@ static int __mdd_lmm_get(const struct lu_env *env, RETURN(rc); } +int mdd_lmm_get_locked(const struct lu_env *env, struct mdd_object *mdd_obj, + struct md_attr *ma) +{ + int rc; + ENTRY; + + mdd_read_lock(env, mdd_obj); + rc = __mdd_lmm_get(env, mdd_obj, ma); + mdd_read_unlock(env, mdd_obj); + RETURN(rc); +} + /* get lmv EA only*/ static int __mdd_lmv_get(const struct lu_env *env, struct mdd_object *mdd_obj, struct md_attr *ma) { int rc; + if (ma->ma_valid & MA_LMV) + RETURN(0); rc = mdd_get_md(env, mdd_obj, ma->ma_lmv, &ma->ma_lmv_size, MDS_LMV_MD_NAME); if (rc > 0) { @@ -562,7 +582,7 @@ static int mdd_attr_set(const struct lu_env *env, struct md_object *obj, struct lu_attr *la_copy = &mdd_env_info(env)->mti_la_for_fix; ENTRY; - mdd_txn_param_build(env, MDD_TXN_ATTR_SET_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_ATTR_SET_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -681,7 +701,7 @@ static int mdd_xattr_set(const struct lu_env *env, struct md_object *obj, if (rc) RETURN(rc); - mdd_txn_param_build(env, MDD_TXN_XATTR_SET_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_XATTR_SET_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -731,7 +751,7 @@ int mdd_xattr_del(const struct lu_env *env, struct md_object *obj, if (rc) RETURN(rc); - mdd_txn_param_build(env, MDD_TXN_XATTR_SET_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_XATTR_SET_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -755,7 +775,10 @@ static int mdd_ref_del(const struct lu_env *env, struct md_object *obj, int rc; ENTRY; - mdd_txn_param_build(env, MDD_TXN_UNLINK_OP); + rc = mdd_log_txn_param_build(env, mdd_obj, ma, MDD_TXN_UNLINK_OP); + if (rc) + RETURN(rc); + handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(-ENOMEM); @@ -824,7 +847,7 @@ static int mdd_object_create(const struct lu_env *env, if (rc) RETURN(rc); - mdd_txn_param_build(env, MDD_TXN_OBJECT_CREATE_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_OBJECT_CREATE_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -894,7 +917,7 @@ static int mdd_ref_add(const struct lu_env *env, int rc; ENTRY; - mdd_txn_param_build(env, MDD_TXN_XATTR_SET_OP); + mdd_txn_param_build(env, mdd, MDD_TXN_XATTR_SET_OP); handle = mdd_trans_start(env, mdd); if (IS_ERR(handle)) RETURN(-ENOMEM); diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 0bb1f30..80f1c65 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -35,7 +35,26 @@ #include #include -struct dt_device; +enum mdd_txn_op { + MDD_TXN_OBJECT_DESTROY_OP = 0, + MDD_TXN_OBJECT_CREATE_OP, + MDD_TXN_ATTR_SET_OP, + MDD_TXN_XATTR_SET_OP, + MDD_TXN_INDEX_INSERT_OP, + MDD_TXN_INDEX_DELETE_OP, + MDD_TXN_LINK_OP, + MDD_TXN_UNLINK_OP, + MDD_TXN_RENAME_OP, + MDD_TXN_RENAME_TGT_OP, + MDD_TXN_CREATE_DATA_OP, + MDD_TXN_MKDIR_OP, + MDD_TXN_LAST_OP +}; + +struct mdd_txn_op_descr { + enum mdd_txn_op mod_op; + unsigned int mod_credits; +}; struct mdd_device { struct md_device mdd_md_dev; @@ -47,6 +66,7 @@ struct mdd_device { struct dt_txn_callback mdd_txn_cb; cfs_proc_dir_entry_t *mdd_proc_entry; struct lprocfs_stats *mdd_stats; + struct mdd_txn_op_descr mdd_tod[MDD_TXN_LAST_OP]; }; enum mod_flags { @@ -126,6 +146,8 @@ int mdd_attr_set_internal_locked(const struct lu_env *env, struct mdd_object *o, const struct lu_attr *attr, struct thandle *handle); +int mdd_lmm_get_locked(const struct lu_env *env, struct mdd_object *mdd_obj, + struct md_attr *ma); /* mdd_dir.c */ int mdd_unlink_sanity_check(const struct lu_env *env, struct mdd_object *pobj, struct mdd_object *cobj, struct md_attr *ma); @@ -182,23 +204,11 @@ extern struct md_dir_operations mdd_dir_ops; extern struct md_object_operations mdd_obj_ops; /* mdd_trans.c */ -enum mdd_txn_op { - MDD_TXN_OBJECT_DESTROY_OP, - MDD_TXN_OBJECT_CREATE_OP, - MDD_TXN_ATTR_SET_OP, - MDD_TXN_XATTR_SET_OP, - MDD_TXN_INDEX_INSERT_OP, - MDD_TXN_INDEX_DELETE_OP, - MDD_TXN_LINK_OP, - MDD_TXN_UNLINK_OP, - MDD_TXN_RENAME_OP, - MDD_TXN_RENAME_TGT_OP, - MDD_TXN_CREATE_DATA_OP, - MDD_TXN_MKDIR_OP -}; +void mdd_txn_param_build(const struct lu_env *env, struct mdd_device *mdd, + enum mdd_txn_op); +int mdd_log_txn_param_build(const struct lu_env *env, struct mdd_object *obj, + struct md_attr *ma, enum mdd_txn_op); -void mdd_txn_param_build(const struct lu_env *env, enum mdd_txn_op op); - static inline void mdd_object_put(const struct lu_env *env, struct mdd_object *o) { @@ -207,17 +217,18 @@ static inline void mdd_object_put(const struct lu_env *env, struct thandle* mdd_trans_start(const struct lu_env *env, struct mdd_device *); -void mdd_trans_stop(const struct lu_env *env, struct mdd_device *mdd, + +void mdd_trans_stop(const struct lu_env *env, struct mdd_device *mdd, int rc, struct thandle *handle); -int mdd_txn_start_cb(const struct lu_env *env, struct txn_param *param, + +int mdd_txn_start_cb(const struct lu_env *env, struct txn_param *param, void *cookie); -int mdd_txn_stop_cb(const struct lu_env *env, struct thandle *txn, +int mdd_txn_stop_cb(const struct lu_env *env, struct thandle *txn, void *cookie); -int mdd_txn_commit_cb(const struct lu_env *env, struct thandle *txn, +int mdd_txn_commit_cb(const struct lu_env *env, struct thandle *txn, void *cookie); - /* mdd_device.c */ struct lu_object *mdd_object_alloc(const struct lu_env *env, const struct lu_object_header *hdr, diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 3559d11..951308d 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -58,10 +58,6 @@ static int mdd_lov_update(struct obd_device *host, upcall_dev = mdd->mdd_md_dev.md_upcall.mu_upcall_dev; rc = upcall_dev->md_upcall.mu_upcall(NULL, upcall_dev, MD_LOV_SYNC); - if (rc) - RETURN(rc); - - rc = mdd_txn_init_credits(NULL, mdd); RETURN(rc); } diff --git a/lustre/mdd/mdd_lproc.c b/lustre/mdd/mdd_lproc.c index 021da3a..36f8522 100644 --- a/lustre/mdd/mdd_lproc.c +++ b/lustre/mdd/mdd_lproc.c @@ -134,5 +134,3 @@ void mdd_lproc_time_end(struct mdd_device *mdd, struct timeval *start, int op) lprocfs_counter_add(mdd->mdd_stats, op, timediff); return; } - - diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 5a5390f..392d13f 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -148,7 +148,8 @@ static void mdd_object_delete(const struct lu_env *env, return; if (test_bit(LU_OBJECT_ORPHAN, &o->lo_header->loh_flags)) { - mdd_txn_param_build(env, MDD_TXN_INDEX_DELETE_OP); + mdd_txn_param_build(env, lu2mdd_dev(o->lo_dev), + MDD_TXN_INDEX_DELETE_OP); handle = mdd_trans_start(env, lu2mdd_dev(o->lo_dev)); if (IS_ERR(handle)) CERROR("Cannot get thandle\n"); diff --git a/lustre/mdd/mdd_trans.c b/lustre/mdd/mdd_trans.c index cc76cdd..f24b2ec 100644 --- a/lustre/mdd/mdd_trans.c +++ b/lustre/mdd/mdd_trans.c @@ -44,56 +44,6 @@ #include "mdd_internal.h" - -struct mdd_txn_op_descr { - enum mdd_txn_op mod_op; - unsigned int mod_credits; -}; - -enum { - MDD_TXN_OBJECT_DESTROY_CREDITS = 0, - MDD_TXN_OBJECT_CREATE_CREDITS = 0, - MDD_TXN_ATTR_SET_CREDITS = 0, - MDD_TXN_XATTR_SET_CREDITS = 0, - MDD_TXN_INDEX_INSERT_CREDITS = 0, - MDD_TXN_INDEX_DELETE_CREDITS = 0, - MDD_TXN_LINK_CREDITS = 0, - MDD_TXN_UNLINK_CREDITS = 0, - MDD_TXN_RENAME_CREDITS = 0, - MDD_TXN_RENAME_TGT_CREDITS = 0, - MDD_TXN_CREATE_DATA_CREDITS = 0, - MDD_TXN_MKDIR_CREDITS = 0 -}; - -#define DEFINE_MDD_TXN_OP_ARRAY(opname, base) \ -[opname ## _OP - base ## _OP]= { \ - .mod_op = opname ## _OP, \ - .mod_credits = opname ## _CREDITS, \ -} - -/* - * number of blocks to reserve for particular operations. Should be function - * of ... something. Stub for now. - */ - -#define DEFINE_MDD_TXN_OP_DESC(opname) \ - DEFINE_MDD_TXN_OP_ARRAY(opname, MDD_TXN_OBJECT_DESTROY) - -static struct mdd_txn_op_descr mdd_txn_descrs[] = { - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_OBJECT_DESTROY), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_OBJECT_CREATE), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_ATTR_SET), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_XATTR_SET), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_INDEX_INSERT), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_INDEX_DELETE), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_LINK), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_UNLINK), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_RENAME), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_RENAME_TGT), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_CREATE_DATA), - DEFINE_MDD_TXN_OP_DESC(MDD_TXN_MKDIR) -}; - int mdd_txn_start_cb(const struct lu_env *env, struct txn_param *param, void *cookie) { @@ -116,112 +66,114 @@ int mdd_txn_commit_cb(const struct lu_env *env, struct thandle *txn, return 0; } -void mdd_txn_param_build(const struct lu_env *env, enum mdd_txn_op op) +static int dto_txn_credits[DTO_NR]; +void mdd_txn_param_build(const struct lu_env *env, struct mdd_device *mdd, + enum mdd_txn_op op) { - LASSERT(0 <= op && op < ARRAY_SIZE(mdd_txn_descrs)); + LASSERT(0 <= op && op < MDD_TXN_LAST_OP); - mdd_env_info(env)->mti_param.tp_credits = - mdd_txn_descrs[op].mod_credits; + mdd_env_info(env)->mti_param.tp_credits = mdd->mdd_tod[op].mod_credits; } -static int mdd_credit_get(const struct lu_env *env, struct mdd_device *mdd, - int op) +int mdd_log_txn_param_build(const struct lu_env *env, struct mdd_object *obj, + struct md_attr *ma, enum mdd_txn_op op) { - int credits; - credits = mdd_child_ops(mdd)->dt_credit_get(env, mdd->mdd_child, - op); - LASSERT(credits > 0); - return credits; + struct mdd_device *mdd = mdo2mdd(&obj->mod_obj); + int rc, log_credits; + + mdd_txn_param_build(env, mdd, op); + + LASSERT(op == MDD_TXN_UNLINK_OP || op == MDD_TXN_RENAME_OP); + rc = mdd_lmm_get_locked(env, obj, ma); + if (rc || !(ma->ma_valid & MA_LOV)) + RETURN(rc); + + log_credits = le32_to_cpu(ma->ma_lmm->lmm_stripe_count) * + dto_txn_credits[DTO_LOG_REC]; + + mdd_env_info(env)->mti_param.tp_credits += log_credits; + + RETURN(rc); } -/* XXX: we should calculate it by lsm count, not ost count. */ -int mdd_txn_init_credits(const struct lu_env *env, struct mdd_device *mdd) +static void mdd_txn_init_dto_credits(const struct lu_env *env, + struct mdd_device *mdd, int *dto_credits) { - struct mds_obd *mds = &mdd->mdd_obd_dev->u.mds; - int ost_count = mds->mds_lov_desc.ld_tgt_count; - - int index_create_credits; - int index_delete_credits; + int op, credits; + for (op = DTO_INDEX_INSERT; op < DTO_NR; op++) { + credits = mdd_child_ops(mdd)->dt_credit_get(env, mdd->mdd_child, + op); + LASSERT(credits > 0); + dto_txn_credits[op] = credits; + } +} - int xattr_credits; - int log_credits; - int create_credits; - int destroy_credits; - int attr_credits; - int num_entries; - int i; +int mdd_txn_init_credits(const struct lu_env *env, struct mdd_device *mdd) +{ + int op; /* Init credits for each ops. */ - num_entries = ARRAY_SIZE(mdd_txn_descrs); - LASSERT(num_entries > 0); - - /* Init the basic credits from osd layer. */ - index_create_credits = mdd_credit_get(env, mdd, DTO_INDEX_INSERT); - index_delete_credits = mdd_credit_get(env, mdd, DTO_INDEX_DELETE); - log_credits = mdd_credit_get(env, mdd, DTO_LOG_REC); - attr_credits = mdd_credit_get(env, mdd, DTO_ATTR_SET); - xattr_credits = mdd_credit_get(env, mdd, DTO_XATTR_SET); - create_credits = mdd_credit_get(env, mdd, DTO_OBJECT_CREATE); - destroy_credits = mdd_credit_get(env, mdd, DTO_OBJECT_DELETE); + mdd_txn_init_dto_credits(env, mdd, dto_txn_credits); /* Calculate the mdd credits. */ - for (i = 0; i < num_entries; i++) { - int opcode = mdd_txn_descrs[i].mod_op; - int *c = &mdd_txn_descrs[i].mod_credits; - switch(opcode) { + for (op = MDD_TXN_OBJECT_DESTROY_OP; op < MDD_TXN_LAST_OP; op++) { + int *c = &mdd->mdd_tod[op].mod_credits; + int *dt = dto_txn_credits; + mdd->mdd_tod[op].mod_op = op; + switch(op) { case MDD_TXN_OBJECT_DESTROY_OP: - *c = destroy_credits; + *c = dt[DTO_OBJECT_DELETE]; break; case MDD_TXN_OBJECT_CREATE_OP: /* OI_INSERT + CREATE OBJECT */ - *c = index_create_credits + create_credits; + *c = dt[DTO_INDEX_INSERT] + + dt[DTO_OBJECT_CREATE]; break; case MDD_TXN_ATTR_SET_OP: /* ATTR set + XATTR(lsm, lmv) set */ - *c = attr_credits + xattr_credits; + *c = dt[DTO_ATTR_SET] + dt[DTO_XATTR_SET]; break; case MDD_TXN_XATTR_SET_OP: - *c = xattr_credits; + *c = dt[DTO_XATTR_SET]; break; case MDD_TXN_INDEX_INSERT_OP: - *c = index_create_credits; + *c = dt[DTO_INDEX_INSERT]; break; case MDD_TXN_INDEX_DELETE_OP: - *c = index_delete_credits; + *c = dt[DTO_INDEX_DELETE]; break; case MDD_TXN_LINK_OP: - *c = index_create_credits; + *c = dt[DTO_INDEX_INSERT]; break; case MDD_TXN_UNLINK_OP: /* delete index + Unlink log */ - *c = index_delete_credits + - log_credits * ost_count; + *c = dt[DTO_INDEX_DELETE]; break; case MDD_TXN_RENAME_OP: /* 2 delete index + 1 insert + Unlink log */ - *c = 2 * index_delete_credits + - index_create_credits + - log_credits * ost_count; + *c = 2 * dt[DTO_INDEX_DELETE] + + dt[DTO_INDEX_INSERT]; break; case MDD_TXN_RENAME_TGT_OP: /* index insert + index delete */ - *c = index_delete_credits + - index_create_credits; + *c = dt[DTO_INDEX_DELETE] + + dt[DTO_INDEX_INSERT]; break; case MDD_TXN_CREATE_DATA_OP: /* same as set xattr(lsm) */ - *c = xattr_credits; + *c = dt[DTO_XATTR_SET]; break; case MDD_TXN_MKDIR_OP: - /* INDEX INSERT + OI INSERT + CREATE_OBJECT_CREDITS + /* INDEX INSERT + OI INSERT + + * CREATE_OBJECT_CREDITS * SET_MD CREDITS is already counted in * CREATE_OBJECT CREDITS */ - *c = 2 * index_create_credits + create_credits; + *c = 2 * dt[DTO_INDEX_INSERT] + + dt[DTO_OBJECT_CREATE]; break; default: - CERROR("Invalid op %d init its credit\n", - opcode); + CERROR("Invalid op %d init its credit\n", op); LBUG(); } } @@ -242,5 +194,3 @@ void mdd_trans_stop(const struct lu_env *env, struct mdd_device *mdd, handle->th_result = result; mdd_child_ops(mdd)->dt_trans_stop(env, handle); } - - diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f6463b6..585dc83 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -306,6 +306,7 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD, RCL_SERVER); } + ma->ma_valid = 0; rc = mo_attr_get(env, next, ma); if (rc == -EREMOTE) { /* This object is located on remote node.*/ @@ -1272,6 +1273,7 @@ static int mdt_sync(struct mdt_thread_info *info) next = mdt_object_child(info->mti_object); info->mti_attr.ma_need = MA_INODE; + info->mti_attr.ma_valid = 0; rc = mo_attr_get(info->mti_env, next, &info->mti_attr); if (rc == 0) { @@ -3935,7 +3937,7 @@ static int mdt_destroy_export(struct obd_export *export) if (ma->ma_lmm == NULL || ma->ma_cookie == NULL) GOTO(out, rc = -ENOMEM); ma->ma_need = MA_LOV | MA_COOKIE; - + ma->ma_valid = 0; /* Close any open files (which may also cause orphan unlinking). */ spin_lock(&med->med_open_lock); while (!list_empty(&med->med_open_head)) { @@ -3956,6 +3958,7 @@ static int mdt_destroy_export(struct obd_export *export) ma->ma_lmm_size = lmm_size; ma->ma_cookie_size = cookie_size; ma->ma_need = MA_LOV | MA_COOKIE; + ma->ma_valid = 0; } spin_unlock(&med->med_open_lock); info->mti_mdt = NULL; diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 87067b6..186ffeb 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -85,6 +85,7 @@ static int mdt_create_data(struct mdt_thread_info *info, RETURN(0); ma->ma_need = MA_INODE | MA_LOV; + ma->ma_valid = 0; rc = mdo_create_data(info->mti_env, p ? mdt_object_child(p) : NULL, mdt_object_child(o), spec, ma); @@ -545,6 +546,7 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); ma->ma_need = MA_INODE | MA_LOV; + ma->ma_valid = 0; mdt_req_from_mcd(req, med->med_mcd); mdt_set_disposition(info, ldlm_rep, mcd->mcd_last_data); @@ -729,6 +731,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); ma->ma_need = MA_INODE | MA_LOV; + ma->ma_valid = 0; LASSERT(info->mti_pill.rc_fmt == &RQF_LDLM_INTENT_OPEN); ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); @@ -905,6 +908,7 @@ finish_open: if (result != 0 && created) { int rc2; ma->ma_need = 0; + ma->ma_valid = 0; ma->ma_cookie_size = 0; rc2 = mdo_unlink(info->mti_env, mdt_object_child(parent), @@ -1031,6 +1035,7 @@ int mdt_close(struct mdt_thread_info *info) &RMF_LOGCOOKIES, RCL_SERVER); ma->ma_need = MA_INODE | MA_LOV | MA_COOKIE; + ma->ma_valid = 0; repbody->eadatasize = 0; repbody->aclsize = 0; } else @@ -1108,6 +1113,7 @@ int mdt_done_writing(struct mdt_thread_info *info) /* Set EPOCH CLOSE flag if not set by client. */ info->mti_epoch->flags |= MF_EPOCH_CLOSE; + info->mti_attr.ma_valid = 0; rc = mdt_mfd_close(info, mfd); } RETURN(rc); diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index bed8558..2182ccd 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -75,6 +75,7 @@ static int mdt_md_create(struct mdt_thread_info *info) struct md_object *next = mdt_object_child(parent); ma->ma_need = MA_INODE; + ma->ma_valid = 0; mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom, OBD_FAIL_MDS_REINT_CREATE_WRITE); @@ -115,6 +116,7 @@ static int mdt_md_mkobj(struct mdt_thread_info *info) struct md_object *next = mdt_object_child(o); ma->ma_need = MA_INODE; + ma->ma_valid = 0; /* Cross-ref create can encounter already created obj in case * of recovery, just get attr in that case */ if (mdt_object_exists(o) == 1) { @@ -281,6 +283,7 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, } ma->ma_need = MA_INODE; + ma->ma_valid = 0; next = mdt_object_child(mo); rc = mo_attr_get(info->mti_env, next, ma); if (rc != 0) @@ -342,7 +345,6 @@ static int mdt_reint_create(struct mdt_thread_info *info, RETURN(rc); } - static int mdt_reint_unlink(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) { @@ -390,7 +392,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, &RMF_LOGCOOKIES, RCL_SERVER); ma->ma_need = MA_INODE | MA_LOV | MA_COOKIE; - + ma->ma_valid = 0; if (!ma->ma_lmm || !ma->ma_cookie) GOTO(out_unlock_parent, rc = -EINVAL); @@ -435,6 +437,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, * whether need MA_LOV and MA_COOKIE. */ ma->ma_need = MA_INODE; + ma->ma_valid = 0; mdt_set_capainfo(info, 1, child_fid, BYPASS_CAPA); rc = mdo_unlink(info->mti_env, mdt_object_child(mp), mdt_object_child(mc), rr->rr_name, ma); @@ -798,6 +801,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, GOTO(out_unlock_new, rc = -EINVAL); ma->ma_need = MA_INODE | MA_LOV | MA_COOKIE; + ma->ma_valid = 0; mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom, OBD_FAIL_MDS_REINT_RENAME_WRITE); -- 1.8.3.1