NFS: allow close-to-open cache semantics to apply to root of NFS filesystem
authorNeil Brown <neilb@suse.de>
Tue, 10 Aug 2010 14:20:05 +0000 (10:20 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 10 Aug 2010 14:20:05 +0000 (10:20 -0400)
To obey NFS cache semantics, the client must verify the cached
attributes when a file is opened.  In most cases this is done by a call to
d_validate as one of the last steps in path_walk.

However for the root of a filesystem, d_validate is only ever called
on the mounted-on filesystem (except when the path ends '.' or '..').
So NFS has no chance to validate the attributes.

So, in nfs_opendir, we revalidate the attributes if the opened
directory is the mountpoint.  This may cause double-validation for "."
and ".." lookups, but that is better than missing regular /path/name
lookups completely.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/dir.c

index 29539ceeb745f8d19fa57816127eceed2c5d989d..bd91b2778315501cefe36bfbbf2cbb097eafa836 100644 (file)
@@ -140,6 +140,13 @@ nfs_opendir(struct inode *inode, struct file *filp)
 
        /* Call generic open code in order to cache credentials */
        res = nfs_open(inode, filp);
+       if (filp->f_path.dentry == filp->f_path.mnt->mnt_root) {
+               /* This is a mountpoint, so d_revalidate will never
+                * have been called, so we need to refresh the
+                * inode (for close-open consistency) ourselves.
+                */
+               __nfs_revalidate_inode(NFS_SERVER(inode), inode);
+       }
        return res;
 }