[PATCH] make O_EXCL in nd->intent.flags visible in nd->flags
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 5 Aug 2008 07:00:49 +0000 (03:00 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 23 Oct 2008 09:12:56 +0000 (05:12 -0400)
New flag: LOOKUP_EXCL.  Set before doing the final step of pathname
resolution on the paths that have LOOKUP_CREATE and O_EXCL.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/gfs2/ops_inode.c
fs/namei.c
fs/nfs/dir.c
include/linux/namei.h

index 534e1e2..d232991 100644 (file)
@@ -69,7 +69,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
                        mark_inode_dirty(inode);
                        break;
                } else if (PTR_ERR(inode) != -EEXIST ||
-                          (nd && (nd->intent.open.flags & O_EXCL))) {
+                          (nd && nd->flags & LOOKUP_EXCL)) {
                        gfs2_holder_uninit(ghs);
                        return PTR_ERR(inode);
                }
index e584f04..2b8f823 100644 (file)
@@ -1709,6 +1709,8 @@ struct file *do_filp_open(int dfd, const char *pathname,
        dir = nd.path.dentry;
        nd.flags &= ~LOOKUP_PARENT;
        nd.flags |= LOOKUP_CREATE | LOOKUP_OPEN;
+       if (flag & O_EXCL)
+               nd.flags |= LOOKUP_EXCL;
        mutex_lock(&dir->d_inode->i_mutex);
        path.dentry = lookup_hash(&nd);
        path.mnt = nd.path.mnt;
@@ -1906,7 +1908,7 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
        if (nd->last_type != LAST_NORM)
                goto fail;
        nd->flags &= ~LOOKUP_PARENT;
-       nd->flags |= LOOKUP_CREATE;
+       nd->flags |= LOOKUP_CREATE | LOOKUP_EXCL;
        nd->intent.open.flags = O_EXCL;
 
        /*
index efdba2e..c216c87 100644 (file)
@@ -707,9 +707,7 @@ static int nfs_is_exclusive_create(struct inode *dir, struct nameidata *nd)
 {
        if (NFS_PROTO(dir)->version == 2)
                return 0;
-       if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_CREATE) == 0)
-               return 0;
-       return (nd->intent.open.flags & O_EXCL) != 0;
+       return nd && nfs_lookup_check_intent(nd, LOOKUP_EXCL);
 }
 
 /*
@@ -1009,7 +1007,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
 
        /* Let vfs_create() deal with O_EXCL. Instantiate, but don't hash
         * the dentry. */
-       if (nd->intent.open.flags & O_EXCL) {
+       if (nd->flags & LOOKUP_EXCL) {
                d_instantiate(dentry, NULL);
                goto out;
        }
index 221e8bc..6b5627a 100644 (file)
@@ -51,8 +51,9 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND};
 /*
  * Intent data
  */
-#define LOOKUP_OPEN            (0x0100)
-#define LOOKUP_CREATE          (0x0200)
+#define LOOKUP_OPEN            0x0100
+#define LOOKUP_CREATE          0x0200
+#define LOOKUP_EXCL            0x0400
 
 extern int user_path_at(int, const char __user *, unsigned, struct path *);