orangefs: reverse sense of is-inode-stale test in d_revalidate
authorMartin Brandenburg <martin@omnibond.com>
Tue, 6 Feb 2018 14:01:26 +0000 (14:01 +0000)
committerMike Marshall <hubcap@omnibond.com>
Tue, 6 Feb 2018 21:38:13 +0000 (16:38 -0500)
If a dentry is deleted, then a dentry is recreated with the same handle
but a different type (i.e. it was a file and now it's a symlink), then
its a different inode.  The check was backwards, so d_revalidate would
not have noticed.

Due to the design of the OrangeFS server, this is rather unlikely.

It's also possible for the dentry to be deleted and recreated with the
same type.  This would be undetectable.  It's a bit of a ship of
Theseus.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
fs/orangefs/dcache.c

index be06e1532a3b7d2a3ec095a8e8cce3d2cdb8bb9c..fe484cf93e5cd50e749091e2c46cb22f63f3c346 100644 (file)
@@ -118,8 +118,12 @@ static int orangefs_d_revalidate(struct dentry *dentry, unsigned int flags)
                return 0;
 
        /* We do not need to continue with negative dentries. */
-       if (!dentry->d_inode)
-               goto out;
+       if (!dentry->d_inode) {
+               gossip_debug(GOSSIP_DCACHE_DEBUG,
+                   "%s: negative dentry or positive dentry and inode valid.\n",
+                   __func__);
+               return 1;
+       }
 
        /* Now we must perform a getattr to validate the inode contents. */
 
@@ -129,14 +133,7 @@ static int orangefs_d_revalidate(struct dentry *dentry, unsigned int flags)
                    __FILE__, __func__, __LINE__);
                return 0;
        }
-       if (ret == 0)
-               return 0;
-
-out:
-       gossip_debug(GOSSIP_DCACHE_DEBUG,
-           "%s: negative dentry or positive dentry and inode valid.\n",
-           __func__);
-       return 1;
+       return !ret;
 }
 
 const struct dentry_operations orangefs_dentry_operations = {