- On failover umount, the orphan should not be cleared on last close.
- In mdt_mfd_close(), the ma_valid should not be set as zero, otherwise,
mds will never issue object destroy to OSS.
Issue:
Signed-off-by: Niu Yawei <niu@whamcloud.com>
Change-Id: If0a894655d0ea42ad0d07e725174b73a137b7adb
Reviewed-on: http://review.whamcloud.com/426
Tested-by: Hudson
Reviewed-by: Mikhail Pershin <tappro@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
MDS_PERM_BYPASS = 1 << 3,
MDS_SOM = 1 << 4,
MDS_QUOTA_IGNORE = 1 << 5,
MDS_PERM_BYPASS = 1 << 3,
MDS_SOM = 1 << 4,
MDS_QUOTA_IGNORE = 1 << 5,
- MDS_CLOSE_CLEANUP = 1 << 6
+ MDS_CLOSE_CLEANUP = 1 << 6,
+ MDS_KEEP_ORPHAN = 1 << 7
};
/* instance of mdt_reint_rec */
};
/* instance of mdt_reint_rec */
+ if (ma->ma_valid & MA_FLAGS && ma->ma_attr_flags & MDS_KEEP_ORPHAN) {
+ mdd_obj->mod_count--;
+
+ if (mdd_obj->mod_flags & ORPHAN_OBJ && !mdd_obj->mod_count)
+ CDEBUG(D_HA, "Object "DFID" is retained in orphan "
+ "list\n", PFID(mdd_object_fid(mdd_obj)));
+ RETURN(0);
+ }
+
/* check without any lock */
if (mdd_obj->mod_count == 1 &&
(mdd_obj->mod_flags & (ORPHAN_OBJ | DEAD_OBJ)) != 0) {
/* check without any lock */
if (mdd_obj->mod_count == 1 &&
(mdd_obj->mod_flags & (ORPHAN_OBJ | DEAD_OBJ)) != 0) {
}
mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
}
mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
- if (handle == NULL &&
- mdd_obj->mod_count == 1 &&
+ if (handle == NULL && mdd_obj->mod_count == 1 &&
(mdd_obj->mod_flags & ORPHAN_OBJ) != 0) {
mdd_write_unlock(env, mdd_obj);
goto again;
(mdd_obj->mod_flags & ORPHAN_OBJ) != 0) {
mdd_write_unlock(env, mdd_obj);
goto again;
rc = mdd_lov_destroy(env, mdd, mdd_obj, &ma->ma_attr);
} else {
rc = mdd_object_kill(env, mdd_obj, ma);
rc = mdd_lov_destroy(env, mdd, mdd_obj, &ma->ma_attr);
} else {
rc = mdd_object_kill(env, mdd_obj, ma);
- if (rc == 0)
- reset = 0;
+ if (rc == 0)
+ reset = 0;
ma->ma_need = 0;
/* It is not for setattr, just tell MDD to send
* DESTROY RPC to OSS if needed */
ma->ma_need = 0;
/* It is not for setattr, just tell MDD to send
* DESTROY RPC to OSS if needed */
- ma->ma_attr_flags = MDS_CLOSE_CLEANUP;
+ ma->ma_attr_flags = MDS_CLOSE_CLEANUP;
+ /* Don't unlink orphan on failover umount, LU-184 */
+ if (exp->exp_flags & OBD_OPT_FAILOVER)
+ ma->ma_attr_flags |= MDS_KEEP_ORPHAN;
mdt_mfd_close(info, mfd);
}
OBD_FREE_LARGE(ma->ma_cookie, cookie_size);
mdt_mfd_close(info, mfd);
}
OBD_FREE_LARGE(ma->ma_cookie, cookie_size);
info->mti_mdt = NULL;
/* cleanup client slot early */
/* Do not erase record for recoverable client. */
info->mti_mdt = NULL;
/* cleanup client slot early */
/* Do not erase record for recoverable client. */
- if (!obd->obd_fail || exp->exp_failed)
+ if (!(exp->exp_flags & OBD_OPT_FAILOVER) || exp->exp_failed)
mdt_client_del(&env, mdt);
lu_env_fini(&env);
mdt_client_del(&env, mdt);
lu_env_fini(&env);
}
ma->ma_need |= MA_INODE;
}
ma->ma_need |= MA_INODE;
+ ma->ma_valid &= ~MA_INODE;
if (!MFD_CLOSED(mode))
rc = mo_close(info->mti_env, next, ma);
if (!MFD_CLOSED(mode))
rc = mo_close(info->mti_env, next, ma);