open-style analog of vfs_path_lookup()
new function: file_open_root(dentry, mnt, name, flags) opens the file vfs_path_lookup would arrive to. Note that name can be empty; in that case the usual requirement that dentry should be a directory is lifted. open-coded equivalents switched to it, may_open() got down exactly one caller and became static. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5b6ca027d8
commit
73d049a40f
7 changed files with 77 additions and 84 deletions
|
@ -1321,13 +1321,11 @@ static ssize_t binary_sysctl(const int *name, int nlen,
|
|||
void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)
|
||||
{
|
||||
const struct bin_table *table = NULL;
|
||||
struct nameidata nd;
|
||||
struct vfsmount *mnt;
|
||||
struct file *file;
|
||||
ssize_t result;
|
||||
char *pathname;
|
||||
int flags;
|
||||
int acc_mode;
|
||||
|
||||
pathname = sysctl_getname(name, nlen, &table);
|
||||
result = PTR_ERR(pathname);
|
||||
|
@ -1337,28 +1335,17 @@ static ssize_t binary_sysctl(const int *name, int nlen,
|
|||
/* How should the sysctl be accessed? */
|
||||
if (oldval && oldlen && newval && newlen) {
|
||||
flags = O_RDWR;
|
||||
acc_mode = MAY_READ | MAY_WRITE;
|
||||
} else if (newval && newlen) {
|
||||
flags = O_WRONLY;
|
||||
acc_mode = MAY_WRITE;
|
||||
} else if (oldval && oldlen) {
|
||||
flags = O_RDONLY;
|
||||
acc_mode = MAY_READ;
|
||||
} else {
|
||||
result = 0;
|
||||
goto out_putname;
|
||||
}
|
||||
|
||||
mnt = current->nsproxy->pid_ns->proc_mnt;
|
||||
result = vfs_path_lookup(mnt->mnt_root, mnt, pathname, 0, &nd);
|
||||
if (result)
|
||||
goto out_putname;
|
||||
|
||||
result = may_open(&nd.path, acc_mode, flags);
|
||||
if (result)
|
||||
goto out_putpath;
|
||||
|
||||
file = dentry_open(nd.path.dentry, nd.path.mnt, flags, current_cred());
|
||||
file = file_open_root(mnt->mnt_root, mnt, pathname, flags);
|
||||
result = PTR_ERR(file);
|
||||
if (IS_ERR(file))
|
||||
goto out_putname;
|
||||
|
@ -1370,10 +1357,6 @@ out_putname:
|
|||
putname(pathname);
|
||||
out:
|
||||
return result;
|
||||
|
||||
out_putpath:
|
||||
path_put(&nd.path);
|
||||
goto out_putname;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue