int rc;
rc = orph_declare_index_insert(env, obj, mdd_object_type(obj), handle);
- if (rc)
+ if (rc != 0)
+ return rc;
+
+ rc = mdo_declare_destroy(env, obj, handle);
+ if (rc != 0)
return rc;
- return mdo_declare_destroy(env, obj, handle);
+ return mdd_declare_links_del(env, obj, handle);
}
/* caller should take a lock before calling */
int mdd_finish_unlink(const struct lu_env *env,
- struct mdd_object *obj, struct md_attr *ma,
- struct thandle *th)
+ struct mdd_object *obj, struct md_attr *ma,
+ const struct mdd_object *pobj,
+ const struct lu_name *lname,
+ struct thandle *th)
{
int rc = 0;
int is_dir = S_ISDIR(ma->ma_attr.la_mode);
} else {
rc = mdo_destroy(env, obj, th);
}
- }
+ } else if (!is_dir) {
+ /* old files may not have link ea; ignore errors */
+ mdd_links_del(env, obj, mdo2fid(pobj), lname, th);
+ }
- RETURN(rc);
+ RETURN(rc);
}
/*
if (rc)
return rc;
- rc = mdd_declare_links_del(env, c, handle);
- if (rc != 0)
- return rc;
-
/* FIXME: need changelog for remove entry */
rc = mdd_declare_changelog_store(env, mdd, name, handle);
}
/* XXX: this transfer to ma will be removed with LOD/OSP */
ma->ma_attr = *cattr;
ma->ma_valid |= MA_INODE;
- rc = mdd_finish_unlink(env, mdd_cobj, ma, handle);
+ rc = mdd_finish_unlink(env, mdd_cobj, ma, mdd_pobj, lname, handle);
/* fetch updated nlink */
if (rc == 0)
rc = mdd_la_get(env, mdd_cobj, cattr, BYPASS_CAPA);
- if (!is_dir)
- /* old files may not have link ea; ignore errors */
- mdd_links_del(env, mdd_cobj, mdo2fid(mdd_pobj), lname, handle);
-
/* if object is removed then we can't get its attrs, use last get */
if (cattr->la_nlink == 0) {
ma->ma_attr = *cattr;
if (rc)
return rc;
- rc = mdd_declare_links_del(env, mdd_tobj, handle);
- if (rc)
- return rc;
-
rc = mdd_declare_finish_unlink(env, mdd_tobj, handle);
if (rc)
return rc;
/* XXX: this transfer to ma will be removed with LOD/OSP */
ma->ma_attr = *tattr;
ma->ma_valid |= MA_INODE;
- rc = mdd_finish_unlink(env, mdd_tobj, ma, handle);
+ rc = mdd_finish_unlink(env, mdd_tobj, ma, mdd_tpobj, ltname,
+ handle);
if (rc != 0) {
CERROR("%s: Failed to unlink tobj "
DFID": rc = %d\n",
GOTO(stop_trans, rc);
ma->ma_attr = *so_attr;
ma->ma_valid |= MA_INODE;
- rc = mdd_finish_unlink(env, mdd_sobj, ma, handle);
+ rc = mdd_finish_unlink(env, mdd_sobj, ma, mdd_pobj, lname, handle);
if (rc != 0)
GOTO(stop_trans, rc);