start the transaction and then take locks.
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: Iba4be17df55459142baa7585f47231f1b72ebf0b
Reviewed-on: https://review.whamcloud.com/43362
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
{
struct thandle *th = NULL;
struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
{
struct thandle *th = NULL;
struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
- bool orphan_exists = true;
int rc = 0, rc1 = 0;
ENTRY;
int rc = 0, rc1 = 0;
ENTRY;
- mdd_write_lock(env, obj, DT_TGT_CHILD);
rc = mdd_orphan_declare_delete(env, obj, th);
rc = mdd_orphan_declare_delete(env, obj, th);
- if (rc == -ENOENT || lu_object_is_dying(obj->mod_obj.mo_lu.lo_header))
- orphan_exists = false;
- else if (rc)
- GOTO(unlock, rc);
+ if (rc && rc != -ENOENT)
+ GOTO(stop, rc);
rc = mdo_declare_destroy(env, obj, th);
rc = mdo_declare_destroy(env, obj, th);
- if (rc)
- GOTO(unlock, rc);
+ if (rc && rc != -ENOENT)
+ GOTO(stop, rc);
}
rc = mdd_trans_start(env, mdd, th);
if (rc)
}
rc = mdd_trans_start(env, mdd, th);
if (rc)
+ mdd_write_lock(env, obj, DT_TGT_CHILD);
if (likely(obj->mod_count == 0)) {
dt_write_lock(env, mdd->mdd_orphans, DT_TGT_ORPHAN);
rc = dt_delete(env, mdd->mdd_orphans, key, th);
/* We should remove object even dt_delete failed */
if (likely(obj->mod_count == 0)) {
dt_write_lock(env, mdd->mdd_orphans, DT_TGT_ORPHAN);
rc = dt_delete(env, mdd->mdd_orphans, key, th);
/* We should remove object even dt_delete failed */
+ if (mdd_object_exists(obj) &&
+ !lu_object_is_dying(obj->mod_obj.mo_lu.lo_header)) {
mdo_ref_del(env, obj, th);
if (S_ISDIR(mdd_object_type(obj))) {
mdo_ref_del(env, obj, th);
mdo_ref_del(env, obj, th);
if (S_ISDIR(mdd_object_type(obj))) {
mdo_ref_del(env, obj, th);
}
dt_write_unlock(env, mdd->mdd_orphans);
}
}
dt_write_unlock(env, mdd->mdd_orphans);
}
mdd_write_unlock(env, obj);
mdd_write_unlock(env, obj);
mdd_trans_stop(env, mdd, 0, th);
RETURN(rc ? rc : rc1);
mdd_trans_stop(env, mdd, 0, th);
RETURN(rc ? rc : rc1);