+ * lock rename source object.
+ *
+ * Both source and source parent may be remote, and source may be a remote
+ * object on source parent, to avoid overriding lock handle, store remote
+ * LOOKUP lock separately in @lhr.
+ *
+ * \retval 0 on success
+ * \retval -ev negative errno upon error
+ */
+static int mdt_rename_source_lock(struct mdt_thread_info *info,
+ struct mdt_object *parent,
+ struct mdt_object *child,
+ struct mdt_lock_handle *lhc,
+ struct mdt_lock_handle *lhr,
+ __u64 ibits,
+ bool cos_incompat)
+{
+ int rc;
+
+ rc = mdt_is_remote_object(info, parent, child);
+ if (rc < 0)
+ return rc;
+
+ if (rc) {
+ /* enqueue remote LOOKUP lock from the parent MDT */
+ __u64 rmt_ibits = MDS_INODELOCK_LOOKUP;
+
+ if (mdt_object_remote(parent)) {
+ rc = mdt_remote_object_lock(info, parent,
+ mdt_object_fid(child),
+ &lhr->mlh_rreg_lh,
+ lhr->mlh_rreg_mode,
+ rmt_ibits, false);
+ if (rc != ELDLM_OK)
+ return rc;
+ } else {
+ LASSERT(mdt_object_remote(child));
+ rc = mdt_object_local_lock(info, child, lhr,
+ &rmt_ibits, 0, true);
+ if (rc < 0)
+ return rc;
+ }
+
+ ibits &= ~MDS_INODELOCK_LOOKUP;
+ }
+
+ if (mdt_object_remote(child)) {
+ rc = mdt_remote_object_lock(info, child, mdt_object_fid(child),
+ &lhc->mlh_rreg_lh,
+ lhc->mlh_rreg_mode,
+ ibits, false);
+ if (rc == ELDLM_OK)
+ rc = 0;
+ } else {
+ rc = mdt_reint_object_lock(info, child, lhc, ibits,
+ cos_incompat);
+ }
+
+ if (!rc)
+ mdt_object_unlock(info, child, lhr, rc);
+
+ return rc;
+}
+
+/*