+ GOTO(out, rc = 1);
+ }
+
+ /* If the dentry is busy, we won't get called in lookup2 if we
+ * return 0, so return 1.
+ *
+ * This is a temporary fix for bug 618962, but is one of the causes of
+ * 619078. */
+ CDEBUG(D_INFO, "d_count: %d\n", atomic_read(&de->d_count));
+ if (it && atomic_read(&de->d_count) > 0) {
+ CERROR("returning 1 for %*s during %s because d_count is %d\n",
+ de->d_name.len, de->d_name.name, ldlm_it2str(it->it_op),
+ atomic_read(&de->d_count));
+ GOTO(out, rc = 1);
+ }
+
+ out:
+ if (ll_d2d(de) == NULL) {
+ CERROR("allocating fsdata\n");
+ ll_set_dd(de);
+ }
+ //down(&ll_d2d(de)->lld_it_sem);
+ // de->d_it = it;
+
+ RETURN(rc);
+}
+
+int ll_set_dd(struct dentry *de)
+{
+ ENTRY;
+ LASSERT(de != NULL);
+
+ lock_kernel();
+
+ if (de->d_fsdata != NULL) {
+ CERROR("dentry %p already has d_fsdata set\n", de);
+ } else {
+ OBD_ALLOC(de->d_fsdata, sizeof(struct ll_dentry_data));
+ sema_init(&ll_d2d(de)->lld_it_sem, 1);