diff options
Diffstat (limited to 'fs/nfs/dir.c')
| -rw-r--r-- | fs/nfs/dir.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 29539ceeb745..e257172d438c 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -140,6 +140,13 @@ nfs_opendir(struct inode *inode, struct file *filp) | |||
| 140 | 140 | ||
| 141 | /* Call generic open code in order to cache credentials */ | 141 | /* Call generic open code in order to cache credentials */ |
| 142 | res = nfs_open(inode, filp); | 142 | res = nfs_open(inode, filp); |
| 143 | if (filp->f_path.dentry == filp->f_path.mnt->mnt_root) { | ||
| 144 | /* This is a mountpoint, so d_revalidate will never | ||
| 145 | * have been called, so we need to refresh the | ||
| 146 | * inode (for close-open consistency) ourselves. | ||
| 147 | */ | ||
| 148 | __nfs_revalidate_inode(NFS_SERVER(inode), inode); | ||
| 149 | } | ||
| 143 | return res; | 150 | return res; |
| 144 | } | 151 | } |
| 145 | 152 | ||
| @@ -1103,7 +1110,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1103 | if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) | 1110 | if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) |
| 1104 | goto no_open_dput; | 1111 | goto no_open_dput; |
| 1105 | /* We can't create new files, or truncate existing ones here */ | 1112 | /* We can't create new files, or truncate existing ones here */ |
| 1106 | openflags &= ~(O_CREAT|O_TRUNC); | 1113 | openflags &= ~(O_CREAT|O_EXCL|O_TRUNC); |
| 1107 | 1114 | ||
| 1108 | /* | 1115 | /* |
| 1109 | * Note: we're not holding inode->i_mutex and so may be racing with | 1116 | * Note: we're not holding inode->i_mutex and so may be racing with |
