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));
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));
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));
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));
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));
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));
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));
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));
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)
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);
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) {
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));
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));
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));
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);
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));
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);
#include <linux/sched.h>
#include <linux/capability.h>
-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;
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 {
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);
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)
{
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,
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);
}
lprocfs_counter_add(mdd->mdd_stats, op, timediff);
return;
}
-
-
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");
#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)
{
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();
}
}
handle->th_result = result;
mdd_child_ops(mdd)->dt_trans_stop(env, handle);
}
-
-
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.*/
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) {
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)) {
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;
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);
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);
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);
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),
&RMF_LOGCOOKIES,
RCL_SERVER);
ma->ma_need = MA_INODE | MA_LOV | MA_COOKIE;
+ ma->ma_valid = 0;
repbody->eadatasize = 0;
repbody->aclsize = 0;
} else
/* 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);
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);
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) {
}
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)
RETURN(rc);
}
-
static int mdt_reint_unlink(struct mdt_thread_info *info,
struct mdt_lock_handle *lhc)
{
&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);
* 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);
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);