/*
* Verify that dentry is valid.
*
- * Should return 1 if dentry can still be trusted, else 0
+ * Should return 1 if dentry can still be trusted, else 0.
*/
static int orangefs_d_revalidate(struct dentry *dentry, unsigned int flags)
{
/* find inode from dentry */
if (!dentry->d_inode) {
- gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: negative dentry.\n",
+ gossip_debug(GOSSIP_DCACHE_DEBUG,
+ "%s: negative dentry.\n",
__func__);
- goto invalid_exit;
+ goto out;
}
gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: inode valid.\n", __func__);
inode = dentry->d_inode;
- /*
- * first perform a lookup to make sure that the object not only
- * exists, but is still in the expected place in the name space
- */
- if (!is_root_handle(inode)) {
- if (!orangefs_revalidate_lookup(dentry))
- goto invalid_exit;
- } else {
- gossip_debug(GOSSIP_DCACHE_DEBUG,
- "%s: root handle, lookup skipped.\n",
- __func__);
+ /* skip root handle lookups. */
+ if (is_root_handle(inode)) {
+ ret = 1;
+ goto out;
}
- /* now perform getattr */
- gossip_debug(GOSSIP_DCACHE_DEBUG,
- "%s: doing getattr: inode: %p, handle: %pU\n",
- __func__,
- inode,
- get_khandle_from_ino(inode));
- ret = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT);
- gossip_debug(GOSSIP_DCACHE_DEBUG,
- "%s: getattr %s (ret = %d), returning %s for dentry i_count=%d\n",
- __func__,
- (ret == 0 ? "succeeded" : "failed"),
- ret,
- (ret == 0 ? "valid" : "INVALID"),
- atomic_read(&inode->i_count));
- if (ret != 0)
- goto invalid_exit;
-
- /* dentry is valid! */
- return 1;
-
-invalid_exit:
- return 0;
+ /* lookup the object. */
+ if (orangefs_revalidate_lookup(dentry))
+ ret = 1;
+
+out:
+ return ret;
}
const struct dentry_operations orangefs_dentry_operations = {