Commit 1ac12b4b authored by Jeff Layton's avatar Jeff Layton Committed by Al Viro

vfs: turn is_dir argument to kern_path_create into a lookup_flags arg

Where we can pass in LOOKUP_DIRECTORY or LOOKUP_REVAL. Any other flags
passed in here are currently ignored.
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7955119e
...@@ -66,7 +66,7 @@ static long do_spu_create(const char __user *pathname, unsigned int flags, ...@@ -66,7 +66,7 @@ static long do_spu_create(const char __user *pathname, unsigned int flags,
struct dentry *dentry; struct dentry *dentry;
int ret; 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); ret = PTR_ERR(dentry);
if (!IS_ERR(dentry)) { if (!IS_ERR(dentry)) {
ret = spufs_create(&path, dentry, flags, mode, neighbor); ret = spufs_create(&path, dentry, flags, mode, neighbor);
......
...@@ -148,7 +148,7 @@ static int dev_mkdir(const char *name, umode_t mode) ...@@ -148,7 +148,7 @@ static int dev_mkdir(const char *name, umode_t mode)
struct path path; struct path path;
int err; 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)) if (IS_ERR(dentry))
return PTR_ERR(dentry); return PTR_ERR(dentry);
......
...@@ -3030,12 +3030,22 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, ...@@ -3030,12 +3030,22 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt,
return file; 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 dentry *dentry = ERR_PTR(-EEXIST);
struct nameidata nd; struct nameidata nd;
int err2; 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) if (error)
return ERR_PTR(error); return ERR_PTR(error);
...@@ -3099,13 +3109,14 @@ void done_path_create(struct path *path, struct dentry *dentry) ...@@ -3099,13 +3109,14 @@ void done_path_create(struct path *path, struct dentry *dentry)
} }
EXPORT_SYMBOL(done_path_create); 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 filename *tmp = getname(pathname);
struct dentry *res; struct dentry *res;
if (IS_ERR(tmp)) if (IS_ERR(tmp))
return ERR_CAST(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); putname(tmp);
return res; return res;
} }
...@@ -3228,7 +3239,7 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) ...@@ -3228,7 +3239,7 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode)
struct path path; struct path path;
int error; int error;
dentry = user_path_create(dfd, pathname, &path, 1); dentry = user_path_create(dfd, pathname, &path, LOOKUP_DIRECTORY);
if (IS_ERR(dentry)) if (IS_ERR(dentry))
return PTR_ERR(dentry); return PTR_ERR(dentry);
......
...@@ -65,8 +65,8 @@ extern int user_path_at_empty(int, const char __user *, unsigned, struct path *, ...@@ -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 int kern_path(const char *, unsigned, struct path *);
extern struct dentry *kern_path_create(int, const char *, 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 *, 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 void done_path_create(struct path *, struct dentry *);
extern struct dentry *kern_path_locked(const char *, struct path *); extern struct dentry *kern_path_locked(const char *, struct path *);
extern int vfs_path_lookup(struct dentry *, struct vfsmount *, extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment