result = mdt_getattr_internal(info, child,
ldlm_rep ? 0 : 1);
if (result != 0)
- mdt_object_unlock(info, child, lhc);
+ mdt_object_unlock(info, child, lhc, 1);
}
GOTO(out, result);
}
/* finally, we can get attr for child. */
result = mdt_getattr_internal(info, child, ldlm_rep ? 0 : 1);
if (result != 0)
- mdt_object_unlock(info, child, lhc);
+ mdt_object_unlock(info, child, lhc, 1);
mdt_object_put(info->mti_ctxt, child);
EXIT;
out_parent:
- mdt_object_unlock(info, parent, lhp);
+ mdt_object_unlock(info, parent, lhp, 1);
out:
return result;
}
return rc == ELDLM_OK ? 0 : -EIO;
}
-void fid_unlock(struct ldlm_namespace *ns, const struct lu_fid *f,
- struct lustre_handle *lh, ldlm_mode_t mode)
+/* just call ldlm_lock_decref() if decref,
+ * else we only call ptlrpc_save_lock() to save this lock in req.
+ * when transaction committed, req will be released and lock will be released */
+void fid_unlock(struct ptlrpc_request *req, const struct lu_fid *f,
+ struct lustre_handle *lh, ldlm_mode_t mode, int decref)
{
- struct ldlm_lock *lock;
-
+ {
/* FIXME: this is debug stuff, remove it later. */
- lock = ldlm_handle2lock(lh);
- if (!lock) {
- CERROR("invalid lock handle "LPX64, lh->cookie);
- LBUG();
+ struct ldlm_lock *lock = ldlm_handle2lock(lh);
+ if (!lock) {
+ CERROR("invalid lock handle "LPX64, lh->cookie);
+ LBUG();
+ }
+ LASSERT(fid_res_name_eq(f, &lock->l_resource->lr_name));
+ LDLM_LOCK_PUT(lock);
}
-
- LASSERT(fid_res_name_eq(f, &lock->l_resource->lr_name));
-
- ldlm_lock_decref(lh, mode);
+ if (decref)
+ ldlm_lock_decref(lh, mode);
+ else
+ ptlrpc_save_lock(req, lh, mode);
}
static struct mdt_object *mdt_obj(struct lu_object *o)
}
void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *o,
- struct mdt_lock_handle *lh)
+ struct mdt_lock_handle *lh, int decref)
{
- struct ldlm_namespace *ns = info->mti_mdt->mdt_namespace;
+ struct ptlrpc_request *req = mdt_info_req(info);
ENTRY;
if (lustre_handle_is_used(&lh->mlh_lh)) {
- fid_unlock(ns, mdt_object_fid(o), &lh->mlh_lh, lh->mlh_mode);
+ fid_unlock(req, mdt_object_fid(o),
+ &lh->mlh_lh, lh->mlh_mode, decref);
lh->mlh_lh.cookie = 0;
}
EXIT;
void mdt_object_unlock_put(struct mdt_thread_info * info,
struct mdt_object * o,
- struct mdt_lock_handle *lh)
+ struct mdt_lock_handle *lh,
+ int decref)
{
- mdt_object_unlock(info, o, lh);
+ mdt_object_unlock(info, o, lh, decref);
mdt_object_put(info->mti_ctxt, o);
}
void mdt_object_unlock(struct mdt_thread_info *,
struct mdt_object *,
- struct mdt_lock_handle *);
+ struct mdt_lock_handle *,
+ int decref);
struct mdt_object *mdt_object_find(const struct lu_context *,
struct mdt_device *,
__u64);
void mdt_object_unlock_put(struct mdt_thread_info *,
struct mdt_object *,
- struct mdt_lock_handle *);
+ struct mdt_lock_handle *,
+ int decref);
int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op);
int mdt_reint_rec(struct mdt_thread_info *);
out_child:
mdt_object_put(info->mti_ctxt, child);
out_parent:
- mdt_object_unlock_put(info, parent, lh);
+ mdt_object_unlock_put(info, parent, lh, result);
out:
return result;
}
mdt_object_put(info->mti_ctxt, child);
} else
rc = PTR_ERR(child);
- mdt_object_unlock_put(info, parent, lh);
+ mdt_object_unlock_put(info, parent, lh, rc);
RETURN(rc);
}
/* FIXME & TODO Please deal with logcookies here*/
GOTO(out_unlock, rc);
out_unlock:
- mdt_object_unlock_put(info, mo, lh);
+ mdt_object_unlock_put(info, mo, lh, rc);
return rc;
}
rc = mdt_handle_last_unlink(info, mc, &RQF_MDS_REINT_UNLINK_LAST);
out_unlock_child:
- mdt_object_unlock_put(info, mc, lhc);
+ mdt_object_unlock_put(info, mc, lhc, rc);
out_unlock_parent:
- mdt_object_unlock_put(info, mp, lhp);
+ mdt_object_unlock_put(info, mp, lhp, rc);
return rc;
}
GOTO(out_unlock_target, rc);
out_unlock_target:
- mdt_object_unlock_put(info, mp, lhp);
+ mdt_object_unlock_put(info, mp, lhp, rc);
out_unlock_source:
- mdt_object_unlock_put(info, ms, lhs);
+ mdt_object_unlock_put(info, ms, lhs, rc);
return rc;
}
out_unlock_tgt:
if (mtgt) {
- mdt_object_unlock_put(info, mtgt, lh_tgt);
+ mdt_object_unlock_put(info, mtgt, lh_tgt, rc);
}
out_unlock_tgtdir:
- mdt_object_unlock_put(info, mtgtdir, lh_tgtdir);
+ mdt_object_unlock_put(info, mtgtdir, lh_tgtdir, rc);
out:
return rc;
}
out_unlock_new:
if (mnew) {
- mdt_object_unlock_put(info, mnew, lh_newp);
+ mdt_object_unlock_put(info, mnew, lh_newp, rc);
}
out_unlock_old:
- mdt_object_unlock_put(info, mold, lh_oldp);
+ mdt_object_unlock_put(info, mold, lh_oldp, rc);
out_unlock_target:
- mdt_object_unlock_put(info, mtgtdir, lh_tgtdirp);
+ mdt_object_unlock_put(info, mtgtdir, lh_tgtdirp, rc);
out_unlock_source:
- mdt_object_unlock_put(info, msrcdir, lh_srcdirp);
+ mdt_object_unlock_put(info, msrcdir, lh_srcdirp, rc);
out:
return rc;
}
}
EXIT;
out_unlock:
- mdt_object_unlock(info, info->mti_object, lh);
+ mdt_object_unlock(info, info->mti_object, lh, rc);
out:
return rc;
}