mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-30 11:04:25 +00:00
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: Jeff Layton <jlayton@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
7955119e02
commit
1ac12b4b6d
4 changed files with 20 additions and 9 deletions
|
@ -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)
|
||||||
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);
|
||||||
|
|
||||||
|
|
21
fs/namei.c
21
fs/namei.c
|
@ -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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
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 *,
|
||||||
|
|
||||||
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 *,
|
||||||
|
|
Loading…
Add table
Reference in a new issue