aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/dir.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 3e64b98f3a93..121b533f1f28 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -973,7 +973,7 @@ struct dentry_operations nfs4_dentry_operations = {
973 * Use intent information to determine whether we need to substitute 973 * Use intent information to determine whether we need to substitute
974 * the NFSv4-style stateful OPEN for the LOOKUP call 974 * the NFSv4-style stateful OPEN for the LOOKUP call
975 */ 975 */
976static int is_atomic_open(struct inode *dir, struct nameidata *nd) 976static int is_atomic_open(struct nameidata *nd)
977{ 977{
978 if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_OPEN) == 0) 978 if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_OPEN) == 0)
979 return 0; 979 return 0;
@@ -996,7 +996,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
996 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); 996 dir->i_sb->s_id, dir->i_ino, dentry->d_name.name);
997 997
998 /* Check that we are indeed trying to open this file */ 998 /* Check that we are indeed trying to open this file */
999 if (!is_atomic_open(dir, nd)) 999 if (!is_atomic_open(nd))
1000 goto no_open; 1000 goto no_open;
1001 1001
1002 if (dentry->d_name.len > NFS_SERVER(dir)->namelen) { 1002 if (dentry->d_name.len > NFS_SERVER(dir)->namelen) {
@@ -1047,10 +1047,10 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
1047 struct inode *dir; 1047 struct inode *dir;
1048 int openflags, ret = 0; 1048 int openflags, ret = 0;
1049 1049
1050 if (!is_atomic_open(nd))
1051 goto no_open;
1050 parent = dget_parent(dentry); 1052 parent = dget_parent(dentry);
1051 dir = parent->d_inode; 1053 dir = parent->d_inode;
1052 if (!is_atomic_open(dir, nd))
1053 goto no_open;
1054 /* We can't create new files in nfs_open_revalidate(), so we 1054 /* We can't create new files in nfs_open_revalidate(), so we
1055 * optimize away revalidation of negative dentries. 1055 * optimize away revalidation of negative dentries.
1056 */ 1056 */
@@ -1062,11 +1062,11 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
1062 1062
1063 /* NFS only supports OPEN on regular files */ 1063 /* NFS only supports OPEN on regular files */
1064 if (!S_ISREG(inode->i_mode)) 1064 if (!S_ISREG(inode->i_mode))
1065 goto no_open; 1065 goto no_open_dput;
1066 openflags = nd->intent.open.flags; 1066 openflags = nd->intent.open.flags;
1067 /* We cannot do exclusive creation on a positive dentry */ 1067 /* We cannot do exclusive creation on a positive dentry */
1068 if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) 1068 if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
1069 goto no_open; 1069 goto no_open_dput;
1070 /* We can't create new files, or truncate existing ones here */ 1070 /* We can't create new files, or truncate existing ones here */
1071 openflags &= ~(O_CREAT|O_TRUNC); 1071 openflags &= ~(O_CREAT|O_TRUNC);
1072 1072
@@ -1081,8 +1081,9 @@ out:
1081 if (!ret) 1081 if (!ret)
1082 d_drop(dentry); 1082 d_drop(dentry);
1083 return ret; 1083 return ret;
1084no_open: 1084no_open_dput:
1085 dput(parent); 1085 dput(parent);
1086no_open:
1086 if (inode != NULL && nfs_have_delegation(inode, FMODE_READ)) 1087 if (inode != NULL && nfs_have_delegation(inode, FMODE_READ))
1087 return 1; 1088 return 1;
1088 return nfs_lookup_revalidate(dentry, nd); 1089 return nfs_lookup_revalidate(dentry, nd);