NFS: Optimise away the close-to-open GETATTR when we have NFSv4 OPEN
NFSv4 should not need to perform an extra close-to-open GETATTR as part of the process of looking up a regular file, since the OPEN call will do that for us. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
786b71f5b7
commit
479219218f
20
fs/nfs/dir.c
20
fs/nfs/dir.c
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue