fuse: make fuse_dentry_revalidate() RCU aware
authorMiklos Szeredi <mszeredi@suse.cz>
Mon, 21 Mar 2011 12:58:06 +0000 (13:58 +0100)
committerMiklos Szeredi <mszeredi@suse.cz>
Mon, 21 Mar 2011 12:58:06 +0000 (13:58 +0100)
Only bail out of fuse_dentry_revalidate() on LOOKUP_RCU when blocking
is actually necessary.

CC: Nick Piggin <npiggin@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
fs/fuse/dir.c

index 3b84b913b16e87454ac3614156c7724b7231f60d..c6ba49bd95b34136d04bae30b83342933c35ce7a 100644 (file)
@@ -158,10 +158,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
 {
        struct inode *inode;
 
-       if (nd && nd->flags & LOOKUP_RCU)
-               return -ECHILD;
-
-       inode = entry->d_inode;
+       inode = ACCESS_ONCE(entry->d_inode);
        if (inode && is_bad_inode(inode))
                return 0;
        else if (fuse_dentry_time(entry) < get_jiffies_64()) {
@@ -177,6 +174,9 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
                if (!inode)
                        return 0;
 
+               if (nd->flags & LOOKUP_RCU)
+                       return -ECHILD;
+
                fc = get_fuse_conn(inode);
                req = fuse_get_req(fc);
                if (IS_ERR(req))