+int ll_revalidate2(struct dentry *de, int flags, struct lookup_intent *it)
+{
+ int rc;
+ ENTRY;
+
+ /* We don't want to cache negative dentries, so return 0 immediately.
+ * We believe that this is safe, that negative dentries cannot be
+ * pinned by someone else */
+ if (de->d_inode == NULL) {
+ CDEBUG(D_INODE, "negative dentry: ret 0 to force lookup2\n");
+ RETURN(0);
+ }
+
+ if (ll_have_lock(de))
+ GOTO(out, rc = 0);
+
+ rc = ll_intent_lock(de->d_parent->d_inode, &de, it, revalidate2_finish);
+ if (rc < 0) {
+ /* Something bad happened; overwrite it_status? */
+ CERROR("ll_intent_lock: %d\n", rc);
+ }
+ /* unfortunately ll_intent_lock may cause a callback and revoke our
+ dentry */
+ spin_lock(&dcache_lock);
+ list_del_init(&de->d_hash);
+ spin_unlock(&dcache_lock);
+ d_rehash(de);
+
+ out:
+ if (!it)
+ de->d_it = NULL;
+
+ RETURN(1);
+}
+
+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);
+ }
+
+ unlock_kernel();
+
+ RETURN(0);
+}