提交 eda72afb 编写于 作者: M Miklos Szeredi 提交者: Al Viro

nfs: don't use intents for checking atomic open

is_atomic_open() is now only used by nfs4_lookup_revalidate() to check whether
it's okay to skip normal revalidation.

It does a racy check for mount read-onlyness and falls back to normal
revalidation if the open would fail.  This makes little sense now that this
function isn't used for determining whether to actually open the file or not.

The d_mountpoint() check still makes sense since it is an indication that we
might be following a mount and so open may not revalidate the dentry.
Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
CC: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 50de348c
...@@ -1366,24 +1366,6 @@ const struct dentry_operations nfs4_dentry_operations = { ...@@ -1366,24 +1366,6 @@ const struct dentry_operations nfs4_dentry_operations = {
.d_release = nfs_d_release, .d_release = nfs_d_release,
}; };
/*
* Use intent information to determine whether we need to substitute
* the NFSv4-style stateful OPEN for the LOOKUP call
*/
static int is_atomic_open(struct nameidata *nd)
{
if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_OPEN) == 0)
return 0;
/* NFS does not (yet) have a stateful open for directories */
if (nd->flags & LOOKUP_DIRECTORY)
return 0;
/* Are we trying to write to a read only partition? */
if (__mnt_is_readonly(nd->path.mnt) &&
(nd->intent.open.flags & (O_CREAT|O_TRUNC|O_ACCMODE)))
return 0;
return 1;
}
static fmode_t flags_to_mode(int flags) static fmode_t flags_to_mode(int flags)
{ {
fmode_t res = (__force fmode_t)flags & FMODE_EXEC; fmode_t res = (__force fmode_t)flags & FMODE_EXEC;
...@@ -1543,10 +1525,12 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) ...@@ -1543,10 +1525,12 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, struct nameidata *nd)
if (nd->flags & LOOKUP_RCU) if (nd->flags & LOOKUP_RCU)
return -ECHILD; return -ECHILD;
inode = dentry->d_inode; if (!(nd->flags & LOOKUP_OPEN) || (nd->flags & LOOKUP_DIRECTORY))
if (!is_atomic_open(nd) || d_mountpoint(dentry)) goto no_open;
if (d_mountpoint(dentry))
goto no_open; goto no_open;
inode = dentry->d_inode;
parent = dget_parent(dentry); parent = dget_parent(dentry);
dir = parent->d_inode; dir = parent->d_inode;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册