Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47921921 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

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: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 786b71f5
Loading
Loading
Loading
Loading
+16 −4
Original line number Original line Diff line number Diff line
@@ -1012,13 +1012,25 @@ int nfs_lookup_verify_inode(struct inode *inode, unsigned int flags)


	if (IS_AUTOMOUNT(inode))
	if (IS_AUTOMOUNT(inode))
		return 0;
		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 */
	/* VFS wants an on-the-wire revalidation */
	if (flags & LOOKUP_REVAL)
	if (flags & LOOKUP_REVAL)
		goto out_force;
		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:
out:
	return (inode->i_nlink == 0) ? -ENOENT : 0;
	return (inode->i_nlink == 0) ? -ENOENT : 0;
out_force:
out_force: