vfs: add helpers to get root and pwd
Add three helpers that retrieve a refcounted copy of the root and cwd from the supplied fs_struct. get_fs_root() get_fs_pwd() get_fs_root_and_pwd() Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -149,18 +149,13 @@ static unsigned int pid_entry_count_dirs(const struct pid_entry *entries,
|
||||
return count;
|
||||
}
|
||||
|
||||
static int get_fs_path(struct task_struct *task, struct path *path, bool root)
|
||||
static int get_task_root(struct task_struct *task, struct path *root)
|
||||
{
|
||||
struct fs_struct *fs;
|
||||
int result = -ENOENT;
|
||||
|
||||
task_lock(task);
|
||||
fs = task->fs;
|
||||
if (fs) {
|
||||
read_lock(&fs->lock);
|
||||
*path = root ? fs->root : fs->pwd;
|
||||
path_get(path);
|
||||
read_unlock(&fs->lock);
|
||||
if (task->fs) {
|
||||
get_fs_root(task->fs, root);
|
||||
result = 0;
|
||||
}
|
||||
task_unlock(task);
|
||||
@@ -173,7 +168,12 @@ static int proc_cwd_link(struct inode *inode, struct path *path)
|
||||
int result = -ENOENT;
|
||||
|
||||
if (task) {
|
||||
result = get_fs_path(task, path, 0);
|
||||
task_lock(task);
|
||||
if (task->fs) {
|
||||
get_fs_pwd(task->fs, path);
|
||||
result = 0;
|
||||
}
|
||||
task_unlock(task);
|
||||
put_task_struct(task);
|
||||
}
|
||||
return result;
|
||||
@@ -185,7 +185,7 @@ static int proc_root_link(struct inode *inode, struct path *path)
|
||||
int result = -ENOENT;
|
||||
|
||||
if (task) {
|
||||
result = get_fs_path(task, path, 1);
|
||||
result = get_task_root(task, path);
|
||||
put_task_struct(task);
|
||||
}
|
||||
return result;
|
||||
@@ -597,7 +597,7 @@ static int mounts_open_common(struct inode *inode, struct file *file,
|
||||
get_mnt_ns(ns);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
if (ns && get_fs_path(task, &root, 1) == 0)
|
||||
if (ns && get_task_root(task, &root) == 0)
|
||||
ret = 0;
|
||||
put_task_struct(task);
|
||||
}
|
||||
|
Reference in New Issue
Block a user