|
@@ -1012,13 +1012,25 @@ int nfs_lookup_verify_inode(struct inode *inode, unsigned int flags)
|
|
|
|
|
|
if (IS_AUTOMOUNT(inode))
|
|
|
return 0;
|
|
|
+
|
|
|
+ if (flags & LOOKUP_OPEN) {
|
|
|
+ switch (inode->i_mode & S_IFMT) {
|
|
|
+ case S_IFREG:
|
|
|
+ /* A NFSv4 OPEN will revalidate later */
|
|
|
+ if (server->caps & NFS_CAP_ATOMIC_OPEN)
|
|
|
+ goto out;
|
|
|
+ /* Fallthrough */
|
|
|
+ case S_IFDIR:
|
|
|
+ if (server->flags & NFS_MOUNT_NOCTO)
|
|
|
+ break;
|
|
|
+ /* NFS close-to-open cache consistency validation */
|
|
|
+ goto out_force;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* VFS wants an on-the-wire revalidation */
|
|
|
if (flags & LOOKUP_REVAL)
|
|
|
goto out_force;
|
|
|
- /* This is an open(2) */
|
|
|
- if ((flags & LOOKUP_OPEN) && !(server->flags & NFS_MOUNT_NOCTO) &&
|
|
|
- (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
|
|
|
- goto out_force;
|
|
|
out:
|
|
|
return (inode->i_nlink == 0) ? -ENOENT : 0;
|
|
|
out_force:
|