RETURN(rc);
}
- if (declare)
- rc = mdd_declare_links_add(env, mdd_tobj, handle, ldata,
- MLAO_IGNORE);
- else
- rc = mdd_links_write(env, mdd_tobj, ldata, handle);
-
- if (rc != 0)
- RETURN(rc);
-
/* If it is mulitple links file, we need update the name entry for
* all parent */
LASSERT(ldata->ld_leh != NULL);
struct md_op_spec *spec,
struct lu_attr *la,
union lmv_mds_md *mgr_ea,
+ struct linkea_data *ldata,
struct thandle *handle)
{
struct lu_attr *la_flag = MDD_ENV_VAR(env, la_for_fix);
buf, 0, handle);
if (rc != 0)
return rc;
+ } else if (S_ISDIR(la->la_mode)) {
+ rc = mdd_declare_links_add(env, mdd_tobj, handle, ldata,
+ MLAO_IGNORE);
+ if (rc != 0)
+ return rc;
}
if (spec->u.sp_ea.eadata != NULL && spec->u.sp_ea.eadatalen != 0) {
struct mdd_object *mdd_pobj,
struct mdd_object *mdd_sobj,
struct mdd_object *mdd_tobj,
+ const struct lu_name *lname,
struct lu_attr *la)
{
struct mdd_thread_info *info = mdd_env_info(env);
struct lu_attr *la_flag = MDD_ENV_VAR(env, la_for_fix);
struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
int mgr_easize;
+ struct linkea_data *ldata = &mdd_env_info(env)->mti_link_data;
int rc;
ENTRY;
la->la_size + 1);
link_buf = *buf;
link_buf.lb_len = la->la_size + 1;
+ memset(link_buf.lb_buf, 0, link_buf.lb_len);
rc = mdd_readlink(env, &mdd_sobj->mod_obj, &link_buf);
if (rc <= 0) {
rc = rc != 0 ? rc : -EFAULT;
spec->u.sp_ea.eadatalen = lmm_buf.lb_len;
spec->sp_cr_flags |= MDS_OPEN_HAS_EA;
}
+ } else if (S_ISDIR(la->la_mode)) {
+ rc = mdd_links_read(env, mdd_sobj, ldata);
+ if (rc < 0 && rc != -ENODATA)
+ RETURN(rc);
}
mgr_ea = (struct lmv_mds_md_v1 *)info->mti_xattr_buf;
rc = mdd_declare_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
spec, la,
(union lmv_mds_md *)info->mti_xattr_buf,
- handle);
+ ldata, handle);
if (rc != 0)
GOTO(stop_trans, rc);
if (rc != 0)
GOTO(stop_trans, rc);
+ if (S_ISDIR(la->la_mode)) {
+ rc = mdd_links_write(env, mdd_tobj, ldata, handle);
+ if (rc != 0)
+ GOTO(stop_trans, rc);
+ }
+
/* Set MIGRATE EA on the source inode, so once the migration needs
* to be re-done during failover, the re-do process can locate the
* target object which is already being created. */
mdd_tobj = md2mdd_obj(tobj);
if (!mdd_object_exists(mdd_tobj)) {
rc = mdd_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
- so_attr);
+ lname, so_attr);
if (rc != 0)
GOTO(put, rc);
}