fs/9p: Add support for marking inode attribute invalid
[linux-3.10.git] / fs / 9p / vfs_dentry.c
index a4ae4be..b6a3b9f 100644 (file)
@@ -100,7 +100,41 @@ static void v9fs_dentry_release(struct dentry *dentry)
        }
 }
 
+static int v9fs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd)
+{
+       struct p9_fid *fid;
+       struct inode *inode;
+       struct v9fs_inode *v9inode;
+
+       if (nd->flags & LOOKUP_RCU)
+               return -ECHILD;
+
+       inode = dentry->d_inode;
+       if (!inode)
+               goto out_valid;
+
+       v9inode = V9FS_I(inode);
+       if (v9inode->cache_validity & V9FS_INO_INVALID_ATTR) {
+               int retval;
+               struct v9fs_session_info *v9ses;
+               fid = v9fs_fid_lookup(dentry);
+               if (IS_ERR(fid))
+                       return PTR_ERR(fid);
+
+               v9ses = v9fs_inode2v9ses(inode);
+               if (v9fs_proto_dotl(v9ses))
+                       retval = v9fs_refresh_inode_dotl(fid, inode);
+               else
+                       retval = v9fs_refresh_inode(fid, inode);
+               if (retval <= 0)
+                       return retval;
+       }
+out_valid:
+       return 1;
+}
+
 const struct dentry_operations v9fs_cached_dentry_operations = {
+       .d_revalidate = v9fs_lookup_revalidate,
        .d_delete = v9fs_cached_dentry_delete,
        .d_release = v9fs_dentry_release,
 };