vfs: turn is_dir argument to kern_path_create into a lookup_flags arg
authorJeff Layton <jlayton@redhat.com>
Tue, 11 Dec 2012 17:10:06 +0000 (12:10 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 20 Dec 2012 23:50:02 +0000 (18:50 -0500)
Where we can pass in LOOKUP_DIRECTORY or LOOKUP_REVAL. Any other flags
passed in here are currently ignored.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/powerpc/platforms/cell/spufs/syscalls.c
drivers/base/devtmpfs.c
fs/namei.c
include/linux/namei.h

index 5b7d8ffbf8907933b21f9be8e4e4333c81a02e9d..baee994fe810cd494d2ab51750d880c611a318ff 100644 (file)
@@ -66,7 +66,7 @@ static long do_spu_create(const char __user *pathname, unsigned int flags,
        struct dentry *dentry;
        int ret;
 
-       dentry = user_path_create(AT_FDCWD, pathname, &path, 1);
+       dentry = user_path_create(AT_FDCWD, pathname, &path, LOOKUP_DIRECTORY);
        ret = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
                ret = spufs_create(&path, dentry, flags, mode, neighbor);
index 147d1a4dd2694eb05a5366cf0a47317eec729479..17cf7cad601e56840adefbd1b16a8d0cd5c8a5d8 100644 (file)
@@ -148,7 +148,7 @@ static int dev_mkdir(const char *name, umode_t mode)
        struct path path;
        int err;
 
-       dentry = kern_path_create(AT_FDCWD, name, &path, 1);
+       dentry = kern_path_create(AT_FDCWD, name, &path, LOOKUP_DIRECTORY);
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
 
index 25a41e02984b058156cb5844dfce9fc95a61f6e1..8f8e41f6eb52d9d84849a4a456d07da974bf5852 100644 (file)
@@ -3030,12 +3030,22 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt,
        return file;
 }
 
-struct dentry *kern_path_create(int dfd, const char *pathname, struct path *path, int is_dir)
+struct dentry *kern_path_create(int dfd, const char *pathname,
+                               struct path *path, unsigned int lookup_flags)
 {
        struct dentry *dentry = ERR_PTR(-EEXIST);
        struct nameidata nd;
        int err2;
-       int error = do_path_lookup(dfd, pathname, LOOKUP_PARENT, &nd);
+       int error;
+       bool is_dir = (lookup_flags & LOOKUP_DIRECTORY);
+
+       /*
+        * Note that only LOOKUP_REVAL and LOOKUP_DIRECTORY matter here. Any
+        * other flags passed in are ignored!
+        */
+       lookup_flags &= LOOKUP_REVAL;
+
+       error = do_path_lookup(dfd, pathname, LOOKUP_PARENT|lookup_flags, &nd);
        if (error)
                return ERR_PTR(error);
 
@@ -3099,13 +3109,14 @@ void done_path_create(struct path *path, struct dentry *dentry)
 }
 EXPORT_SYMBOL(done_path_create);
 
-struct dentry *user_path_create(int dfd, const char __user *pathname, struct path *path, int is_dir)
+struct dentry *user_path_create(int dfd, const char __user *pathname,
+                               struct path *path, unsigned int lookup_flags)
 {
        struct filename *tmp = getname(pathname);
        struct dentry *res;
        if (IS_ERR(tmp))
                return ERR_CAST(tmp);
-       res = kern_path_create(dfd, tmp->name, path, is_dir);
+       res = kern_path_create(dfd, tmp->name, path, lookup_flags);
        putname(tmp);
        return res;
 }
@@ -3228,7 +3239,7 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode)
        struct path path;
        int error;
 
-       dentry = user_path_create(dfd, pathname, &path, 1);
+       dentry = user_path_create(dfd, pathname, &path, LOOKUP_DIRECTORY);
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
 
index 66542b644804d12bc6acb3e871e138b2a54e8d91..e998c030061d30741c85d2738caf31dfec06ca68 100644 (file)
@@ -65,8 +65,8 @@ extern int user_path_at_empty(int, const char __user *, unsigned, struct path *,
 
 extern int kern_path(const char *, unsigned, struct path *);
 
-extern struct dentry *kern_path_create(int, const char *, struct path *, int);
-extern struct dentry *user_path_create(int, const char __user *, struct path *, int);
+extern struct dentry *kern_path_create(int, const char *, struct path *, unsigned int);
+extern struct dentry *user_path_create(int, const char __user *, struct path *, unsigned int);
 extern void done_path_create(struct path *, struct dentry *);
 extern struct dentry *kern_path_locked(const char *, struct path *);
 extern int vfs_path_lookup(struct dentry *, struct vfsmount *,