X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_trans.c;h=3ba0bf86d92f0aec8a1ab9e122f46ff6d6b70682;hb=72a29cd28c104ae0948fe5f29146005aa1e5a999;hp=743762f999bbc2ee9ca7b2aa54fa0d03c23ccb89;hpb=6869932b552ac705f411de3362f01bd50c1f6f7d;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_trans.c b/lustre/mdd/mdd_trans.c index 743762f..3ba0bf8 100644 --- a/lustre/mdd/mdd_trans.c +++ b/lustre/mdd/mdd_trans.c @@ -46,14 +46,22 @@ #define DEBUG_SUBSYSTEM S_MDS #include +#ifdef HAVE_EXT4_LDISKFS +#include +#else #include +#endif #include #include #include #include #include +#ifdef HAVE_EXT4_LDISKFS +#include +#else #include +#endif #include #include @@ -121,17 +129,39 @@ int mdd_log_txn_param_build(const struct lu_env *env, struct md_object *obj, if (rc || !(ma->ma_valid & MA_LOV)) RETURN(rc); - LASSERT(le32_to_cpu(ma->ma_lmm->lmm_magic) == LOV_MAGIC); + LASSERTF(le32_to_cpu(ma->ma_lmm->lmm_magic) == LOV_MAGIC_V1 || + le32_to_cpu(ma->ma_lmm->lmm_magic) == LOV_MAGIC_V3, + "%08x", le32_to_cpu(ma->ma_lmm->lmm_magic)); + if ((int)le32_to_cpu(ma->ma_lmm->lmm_stripe_count) < 0) stripe = mdd2obd_dev(mdd)->u.mds.mds_lov_desc.ld_tgt_count; else stripe = le32_to_cpu(ma->ma_lmm->lmm_stripe_count); log_credits = stripe * dto_txn_credits[DTO_LOG_REC]; - mdd_env_info(env)->mti_param.tp_credits += log_credits; + txn_param_credit_add(&mdd_env_info(env)->mti_param, log_credits); RETURN(rc); } +int mdd_setattr_txn_param_build(const struct lu_env *env, struct md_object *obj, + struct md_attr *ma, enum mdd_txn_op op) +{ + struct mdd_device *mdd = mdo2mdd(&md2mdd_obj(obj)->mod_obj); + ENTRY; + + mdd_txn_param_build(env, mdd, op); + if (ma->ma_attr.la_valid & (LA_UID | LA_GID)) + txn_param_credit_add(&mdd_env_info(env)->mti_param, + dto_txn_credits[DTO_ATTR_SET_CHOWN]); + + /* permission changes may require sync operation */ + if (ma->ma_attr.la_valid & (LA_MODE|LA_UID|LA_GID) && + mdd->mdd_sync_permission == 1) + txn_param_sync(&mdd_env_info(env)->mti_param); + + RETURN(0); +} + static void mdd_txn_init_dto_credits(const struct lu_env *env, struct mdd_device *mdd, int *dto_credits) { @@ -139,7 +169,7 @@ static void mdd_txn_init_dto_credits(const struct lu_env *env, for (op = 0; op < DTO_NR; op++) { credits = mdd_child_ops(mdd)->dt_credit_get(env, mdd->mdd_child, op); - LASSERT(credits > 0); + LASSERT(credits >= 0); dto_txn_credits[op] = credits; } } @@ -158,16 +188,18 @@ int mdd_txn_init_credits(const struct lu_env *env, struct mdd_device *mdd) mdd->mdd_tod[op].mod_op = op; switch(op) { case MDD_TXN_OBJECT_DESTROY_OP: + /* Unused now */ *c = dt[DTO_OBJECT_DELETE]; break; case MDD_TXN_OBJECT_CREATE_OP: - /* OI_INSERT + CREATE OBJECT */ + /* OI INSERT + CREATE OBJECT */ *c = dt[DTO_INDEX_INSERT] + - dt[DTO_OBJECT_CREATE]; + dt[DTO_OBJECT_CREATE]; break; case MDD_TXN_ATTR_SET_OP: /* ATTR set + XATTR(lsm, lmv) set */ - *c = dt[DTO_ATTR_SET] + dt[DTO_XATTR_SET]; + *c = dt[DTO_ATTR_SET_BASE] + + dt[DTO_XATTR_SET]; break; case MDD_TXN_XATTR_SET_OP: *c = dt[DTO_XATTR_SET]; @@ -182,18 +214,28 @@ int mdd_txn_init_credits(const struct lu_env *env, struct mdd_device *mdd) *c = dt[DTO_INDEX_INSERT]; break; case MDD_TXN_UNLINK_OP: - /* delete index + Unlink log */ - *c = dt[DTO_INDEX_DELETE]; + /* delete index + Unlink log + + * mdd orphan handling */ + *c = dt[DTO_INDEX_DELETE] + + dt[DTO_INDEX_DELETE] + + dt[DTO_INDEX_INSERT] * 2 + + dt[DTO_XATTR_SET] * 3; break; case MDD_TXN_RENAME_OP: /* 2 delete index + 1 insert + Unlink log */ *c = 2 * dt[DTO_INDEX_DELETE] + - dt[DTO_INDEX_INSERT]; + dt[DTO_INDEX_INSERT] + + dt[DTO_INDEX_DELETE] + + dt[DTO_INDEX_INSERT] * 2 + + dt[DTO_XATTR_SET] * 3; break; case MDD_TXN_RENAME_TGT_OP: /* index insert + index delete */ *c = dt[DTO_INDEX_DELETE] + - dt[DTO_INDEX_INSERT]; + dt[DTO_INDEX_INSERT] + + dt[DTO_INDEX_DELETE] + + dt[DTO_INDEX_INSERT] * 2 + + dt[DTO_XATTR_SET] * 3; break; case MDD_TXN_CREATE_DATA_OP: /* same as set xattr(lsm) */ @@ -206,7 +248,7 @@ int mdd_txn_init_credits(const struct lu_env *env, struct mdd_device *mdd) * CREATE_OBJECT CREDITS */ *c = 2 * dt[DTO_INDEX_INSERT] + - dt[DTO_OBJECT_CREATE]; + dt[DTO_OBJECT_CREATE]; break; default: CERROR("Invalid op %d init its credit\n", op); @@ -221,7 +263,7 @@ struct thandle* mdd_trans_start(const struct lu_env *env, { struct txn_param *p = &mdd_env_info(env)->mti_param; struct thandle *th; - + th = mdd_child_ops(mdd)->dt_trans_start(env, mdd->mdd_child, p); return th; }