if (!mdd_object_exists(cobj))
RETURN(-ENOENT);
+ if (mdd_is_dead_obj(cobj))
+ RETURN(-ESTALE);
+
if (pobj) {
+ if (!mdd_object_exists(pobj))
+ RETURN(-ENOENT);
+
if (mdd_is_dead_obj(pobj))
RETURN(-ENOENT);
int rc = 0;
ENTRY;
+ if (!mdd_object_exists(src_obj))
+ RETURN(-ENOENT);
+
if (mdd_is_dead_obj(src_obj))
RETURN(-ESTALE);
int reset = 1;
ENTRY;
+ LASSERT(mdd_write_locked(env, obj) != 0);
+
rc = mdd_iattr_get(env, obj, ma);
if (rc == 0 && ma->ma_attr.la_nlink == 0) {
+ obj->mod_flags |= DEAD_OBJ;
/* add new orphan and the object
* will be deleted during mdd_close() */
if (obj->mod_count) {
rc = __mdd_orphan_add(env, obj, th);
- if (rc == 0) {
- obj->mod_flags |= ORPHAN_OBJ;
- CDEBUG(D_HA, "Object "DFID" is going to be "
- "an orphan, open count = %d\n",
+ if (rc == 0)
+ CDEBUG(D_HA, "Object "DFID" is inserted into "
+ "orphan list, open count = %d\n",
PFID(mdd_object_fid(obj)),
obj->mod_count);
- }
- }
-
- obj->mod_flags |= DEAD_OBJ;
- if (!(obj->mod_flags & ORPHAN_OBJ)) {
+ else
+ CERROR("Object "DFID" fail to be an orphan, "
+ "open count = %d, maybe cause failed "
+ "open replay\n",
+ PFID(mdd_object_fid(obj)),
+ obj->mod_count);
+ } else {
rc = mdd_object_kill(env, obj, ma);
if (rc == 0)
reset = 0;
int rc;
ENTRY;
- if (mdd_is_dead_obj(cobj))
- RETURN(-ESTALE);
-
rc = mdd_may_delete(env, pobj, cobj, ma, 1, 1);
RETURN(rc);
* before mdd_rename and enable MDS_PERM_BYPASS. */
LASSERT(sobj);
- if (mdd_is_dead_obj(sobj))
- RETURN(-ESTALE);
-
rc = mdd_may_delete(env, src_pobj, sobj, ma, 1, 0);
if (rc)
RETURN(rc);
/* "mv dir1 dir2" needs "dir1/.." link update */
if (is_dir && mdd_sobj) {
rc = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
- mdd_object_capa(env, mdd_spobj));
+ mdd_object_capa(env, mdd_sobj));
if (rc)
GOTO(fixup_spobj2, rc);
rc = __mdd_index_insert_only(env, mdd_sobj, tpobj_fid, dotdot,
- handle, mdd_object_capa(env, mdd_tpobj));
+ handle, mdd_object_capa(env, mdd_sobj));
if (rc) {
GOTO(fixup_spobj, rc);
}
rc = __mdd_index_delete(env, mdd_tpobj, tname, is_dir, handle,
mdd_object_capa(env, mdd_tpobj));
if (rc != 0) {
- if (mdd_tobj && mdd_object_exists(mdd_tobj)) {
+ if (mdd_tobj) {
/* tname might been renamed to something else */
GOTO(fixup_spobj, rc);
}
rc = __mdd_index_insert(env, mdd_tpobj, lf, tname, is_dir, handle,
mdd_object_capa(env, mdd_tpobj));
if (rc)
- GOTO(fixup_spobj, rc);
+ GOTO(fixup_tpobj, rc);
LASSERT(ma->ma_attr.la_valid & LA_CTIME);
la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
fixup_tpobj:
if (rc) {
rc2 = __mdd_index_delete(env, mdd_tpobj, tname, is_dir, handle,
- mdd_object_capa(env, mdd_tpobj));
+ BYPASS_CAPA);
if (rc2)
CWARN("tp obj fix error %d\n",rc2);
+ if (mdd_tobj && mdd_object_exists(mdd_tobj) &&
+ !mdd_is_dead_obj(mdd_tobj)) {
+ rc2 = __mdd_index_insert(env, mdd_tpobj,
+ mdo2fid(mdd_tobj), tname,
+ is_dir, handle,
+ BYPASS_CAPA);
+
+ if (rc2)
+ CWARN("tp obj fix error %d\n",rc2);
+ }
}
+
fixup_spobj:
if (rc && is_dir && mdd_sobj) {
rc2 = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
- mdd_object_capa(env, mdd_spobj));
+ BYPASS_CAPA);
if (rc2)
CWARN("sp obj dotdot delete error %d\n",rc2);
rc2 = __mdd_index_insert_only(env, mdd_sobj, spobj_fid,
- dotdot, handle,
- mdd_object_capa(env, mdd_spobj));
+ dotdot, handle, BYPASS_CAPA);
if (rc2)
CWARN("sp obj dotdot insert error %d\n",rc2);
}
fixup_spobj2:
if (rc) {
rc2 = __mdd_index_insert(env, mdd_spobj,
- lf, sname, is_dir, handle,
- mdd_object_capa(env, mdd_tpobj));
+ lf, sname, is_dir, handle, BYPASS_CAPA);
if (rc2)
CWARN("sp obj fix error %d\n",rc2);
}