aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/ops_inode.c2
-rw-r--r--fs/namei.c4
-rw-r--r--fs/nfs/dir.c6
-rw-r--r--include/linux/namei.h5
4 files changed, 9 insertions, 8 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index 534e1e2c65ca..d232991b9046 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -69,7 +69,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
69 mark_inode_dirty(inode); 69 mark_inode_dirty(inode);
70 break; 70 break;
71 } else if (PTR_ERR(inode) != -EEXIST || 71 } else if (PTR_ERR(inode) != -EEXIST ||
72 (nd && (nd->intent.open.flags & O_EXCL))) { 72 (nd && nd->flags & LOOKUP_EXCL)) {
73 gfs2_holder_uninit(ghs); 73 gfs2_holder_uninit(ghs);
74 return PTR_ERR(inode); 74 return PTR_ERR(inode);
75 } 75 }
diff --git a/fs/namei.c b/fs/namei.c
index e584f04745b5..2b8f823eda44 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1709,6 +1709,8 @@ struct file *do_filp_open(int dfd, const char *pathname,
1709 dir = nd.path.dentry; 1709 dir = nd.path.dentry;
1710 nd.flags &= ~LOOKUP_PARENT; 1710 nd.flags &= ~LOOKUP_PARENT;
1711 nd.flags |= LOOKUP_CREATE | LOOKUP_OPEN; 1711 nd.flags |= LOOKUP_CREATE | LOOKUP_OPEN;
1712 if (flag & O_EXCL)
1713 nd.flags |= LOOKUP_EXCL;
1712 mutex_lock(&dir->d_inode->i_mutex); 1714 mutex_lock(&dir->d_inode->i_mutex);
1713 path.dentry = lookup_hash(&nd); 1715 path.dentry = lookup_hash(&nd);
1714 path.mnt = nd.path.mnt; 1716 path.mnt = nd.path.mnt;
@@ -1906,7 +1908,7 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
1906 if (nd->last_type != LAST_NORM) 1908 if (nd->last_type != LAST_NORM)
1907 goto fail; 1909 goto fail;
1908 nd->flags &= ~LOOKUP_PARENT; 1910 nd->flags &= ~LOOKUP_PARENT;
1909 nd->flags |= LOOKUP_CREATE; 1911 nd->flags |= LOOKUP_CREATE | LOOKUP_EXCL;
1910 nd->intent.open.flags = O_EXCL; 1912 nd->intent.open.flags = O_EXCL;
1911 1913
1912 /* 1914 /*
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index efdba2e802d7..c216c8786c51 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -707,9 +707,7 @@ static int nfs_is_exclusive_create(struct inode *dir, struct nameidata *nd)
707{ 707{
708 if (NFS_PROTO(dir)->version == 2) 708 if (NFS_PROTO(dir)->version == 2)
709 return 0; 709 return 0;
710 if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_CREATE) == 0) 710 return nd && nfs_lookup_check_intent(nd, LOOKUP_EXCL);
711 return 0;
712 return (nd->intent.open.flags & O_EXCL) != 0;
713} 711}
714 712
715/* 713/*
@@ -1009,7 +1007,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
1009 1007
1010 /* Let vfs_create() deal with O_EXCL. Instantiate, but don't hash 1008 /* Let vfs_create() deal with O_EXCL. Instantiate, but don't hash
1011 * the dentry. */ 1009 * the dentry. */
1012 if (nd->intent.open.flags & O_EXCL) { 1010 if (nd->flags & LOOKUP_EXCL) {
1013 d_instantiate(dentry, NULL); 1011 d_instantiate(dentry, NULL);
1014 goto out; 1012 goto out;
1015 } 1013 }
diff --git a/include/linux/namei.h b/include/linux/namei.h
index 221e8bc894ba..6b5627afd2eb 100644
--- a/include/linux/namei.h
+++ b/include/linux/namei.h
@@ -51,8 +51,9 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND};
51/* 51/*
52 * Intent data 52 * Intent data
53 */ 53 */
54#define LOOKUP_OPEN (0x0100) 54#define LOOKUP_OPEN 0x0100
55#define LOOKUP_CREATE (0x0200) 55#define LOOKUP_CREATE 0x0200
56#define LOOKUP_EXCL 0x0400
56 57
57extern int user_path_at(int, const char __user *, unsigned, struct path *); 58extern int user_path_at(int, const char __user *, unsigned, struct path *);
58 59