+
+ if (dchild->d_flags & DCACHE_CROSS_REF) {
+ struct ldlm_res_id res_id = { . name = {0} };
+ ldlm_policy_data_t policy;
+ int flags = 0;
+ CDEBUG(D_OTHER, "cross reference: %lu/%lu/%lu\n",
+ (unsigned long) dchild->d_mdsnum,
+ (unsigned long) dchild->d_inum,
+ (unsigned long) dchild->d_generation);
+ body->valid |= OBD_MD_FLID | OBD_MD_MDS;
+ body->fid1.id = dchild->d_inum;
+ body->fid1.mds = dchild->d_mdsnum;
+ body->fid1.generation = dchild->d_generation;
+ intent_set_disposition(rep, DISP_LOOKUP_POS);
+ res_id.name[0] = dchild->d_inum;
+ res_id.name[1] = dchild->d_generation;
+ 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);
+ }
+