summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2012-06-05 09:10:21 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-07-14 08:33:12 -0400
commiteda72afb9ef9f45941fb09260c0f268ff81ec40d (patch)
treecc2fa751ec6f0f2b0efb2ec15c7a12327f98157c
parent50de348c3604f7684a89ce64180666d4dd74623f (diff)
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: Miklos Szeredi <mszeredi@suse.cz> CC: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/nfs/dir.c24
1 files changed, 4 insertions, 20 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 0432f474771b..e6d55dc93ffd 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1366,24 +1366,6 @@ const struct dentry_operations nfs4_dentry_operations = {
1366 .d_release = nfs_d_release, 1366 .d_release = nfs_d_release,
1367}; 1367};
1368 1368
1369/*
1370 * Use intent information to determine whether we need to substitute
1371 * the NFSv4-style stateful OPEN for the LOOKUP call
1372 */
1373static int is_atomic_open(struct nameidata *nd)
1374{
1375 if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_OPEN) == 0)
1376 return 0;
1377 /* NFS does not (yet) have a stateful open for directories */
1378 if (nd->flags & LOOKUP_DIRECTORY)
1379 return 0;
1380 /* Are we trying to write to a read only partition? */
1381 if (__mnt_is_readonly(nd->path.mnt) &&
1382 (nd->intent.open.flags & (O_CREAT|O_TRUNC|O_ACCMODE)))
1383 return 0;
1384 return 1;
1385}
1386
1387static fmode_t flags_to_mode(int flags) 1369static fmode_t flags_to_mode(int flags)
1388{ 1370{
1389 fmode_t res = (__force fmode_t)flags & FMODE_EXEC; 1371 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 if (nd->flags & LOOKUP_RCU) 1525 if (nd->flags & LOOKUP_RCU)
1544 return -ECHILD; 1526 return -ECHILD;
1545 1527
1546 inode = dentry->d_inode; 1528 if (!(nd->flags & LOOKUP_OPEN) || (nd->flags & LOOKUP_DIRECTORY))
1547 if (!is_atomic_open(nd) || d_mountpoint(dentry)) 1529 goto no_open;
1530 if (d_mountpoint(dentry))
1548 goto no_open; 1531 goto no_open;
1549 1532
1533 inode = dentry->d_inode;
1550 parent = dget_parent(dentry); 1534 parent = dget_parent(dentry);
1551 dir = parent->d_inode; 1535 dir = parent->d_inode;
1552 1536