+
+ if (dchild->d_flags & DCACHE_CROSS_REF) {
+ struct ldlm_res_id res_id = { . name = {0} };
+ ldlm_policy_data_t policy;
+ int flags = 0;
+
+ mds_pack_dentry2body(obd, body, dchild, 1);
+ intent_set_disposition(rep, DISP_LOOKUP_POS);
+
+ CDEBUG(D_OTHER, "cross reference: "DLID4"\n",
+ OLID4(&body->id1));
+
+ res_id.name[0] = dchild->d_fid;
+ res_id.name[1] = dchild->d_mdsnum;
+
+ policy.l_inodebits.bits = MDS_INODELOCK_LOOKUP;
+ rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace,
+ res_id, LDLM_IBITS, &policy,
+ LCK_PR, &flags, mds_blocking_ast,
+ ldlm_completion_ast, NULL, NULL,
+ NULL, 0, NULL, child_lockh);
+#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);
+ if (mea)
+ OBD_FREE(mea, mea_size);
+ l_dput(dchild);
+ l_dput(dparent);
+ RETURN(rc);
+ }
+