- if (dchild->d_flags & DCACHE_CROSS_REF) {
- CDEBUG(D_OTHER, "cross reference: "DLID4"\n", OLID4(rec->ur_id1));
- LASSERT(rec->ur_namelen > 1);
-
- /* we're gonna acquire LOOKUP lock on the child,
- * but we have already locked parent and our order
- * may conflict with enqueue_order_locks(). so,
- * drop parent lock and acquire both the locks in
- * common order. bug 6190 */
-#ifdef S_PDIROPS
- if (parent_lockh[1].cookie != 0)
- ldlm_lock_decref(parent_lockh + 1, update_mode);
-#endif
- ldlm_lock_decref(parent_lockh, parent_mode);
- l_dput(dchild);
- l_dput(dparent);
- cleanup_phase = 0;
-
- rc = mds_get_parent_child_locked(obd, mds, rec->ur_id1,
- parent_lockh, &dparent,
- LCK_PR, MDS_INODELOCK_UPDATE,
- &update_mode, rec->ur_name,
- rec->ur_namelen, child_lockh,
- &dchild, LCK_PR,
- MDS_INODELOCK_LOOKUP);
-
- if (rc)
- GOTO(cleanup, rc);
-
-#ifdef S_PDIROPS
- if (parent_lockh[1].cookie != 0)
- ldlm_lock_decref(parent_lockh + 1, update_mode);
-#endif
- ldlm_lock_decref(parent_lockh, LCK_PR);
-
- if (dchild->d_inode || !(dchild->d_flags & DCACHE_CROSS_REF)) {
- CDEBUG(D_OTHER, "race: name changed (%p)\n",
- dchild->d_inode);
- if (dchild->d_inode)
- ldlm_lock_decref(child_lockh, LCK_PR);
- l_dput(dchild);
- l_dput(dparent);
- GOTO(restart, rc);
- }
-
- mds_pack_dentry2body(obd, body, dchild, 1);
- intent_set_disposition(rep, DISP_LOOKUP_POS);
- intent_set_disposition(rep, DISP_LOOKUP_EXECD);
-
- if (mea)
- OBD_FREE(mea, mea_size);
- l_dput(dchild);
- l_dput(dparent);
- RETURN(rc);
- }
-