diff options
-rw-r--r-- | fs/gfs2/ops_inode.c | 2 | ||||
-rw-r--r-- | fs/namei.c | 4 | ||||
-rw-r--r-- | fs/nfs/dir.c | 6 | ||||
-rw-r--r-- | include/linux/namei.h | 5 |
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 | ||
57 | extern int user_path_at(int, const char __user *, unsigned, struct path *); | 58 | extern int user_path_at(int, const char __user *, unsigned, struct path *); |
58 | 59 | ||