Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7ad3c6b authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Al Viro
Browse files

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: default avatarMiklos Szeredi <mszeredi@suse.cz>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 542ce7a9
Loading
Loading
Loading
Loading
+2 −12
Original line number Diff line number Diff line
@@ -552,7 +552,6 @@ static int cachefiles_daemon_tag(struct cachefiles_cache *cache, char *args)
 */
static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args)
{
	struct fs_struct *fs;
	struct path path;
	const struct cred *saved_cred;
	int ret;
@@ -573,11 +572,7 @@ static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args)
	}

	/* extract the directory dentry from the cwd */
	fs = current->fs;
	read_lock(&fs->lock);
	path = fs->pwd;
	path_get(&path);
	read_unlock(&fs->lock);
	get_fs_pwd(current->fs, &path);

	if (!S_ISDIR(path.dentry->d_inode->i_mode))
		goto notdir;
@@ -629,7 +624,6 @@ inval:
 */
static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args)
{
	struct fs_struct *fs;
	struct path path;
	const struct cred *saved_cred;
	int ret;
@@ -650,11 +644,7 @@ static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args)
	}

	/* extract the directory dentry from the cwd */
	fs = current->fs;
	read_lock(&fs->lock);
	path = fs->pwd;
	path_get(&path);
	read_unlock(&fs->lock);
	get_fs_pwd(current->fs, &path);

	if (!S_ISDIR(path.dentry->d_inode->i_mode))
		goto notdir;
+2 −10
Original line number Diff line number Diff line
@@ -2014,10 +2014,7 @@ char *d_path(const struct path *path, char *buf, int buflen)
	if (path->dentry->d_op && path->dentry->d_op->d_dname)
		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);

	read_lock(&current->fs->lock);
	root = current->fs->root;
	path_get(&root);
	read_unlock(&current->fs->lock);
	get_fs_root(current->fs, &root);
	spin_lock(&dcache_lock);
	tmp = root;
	res = __d_path(path, &tmp, buf, buflen);
@@ -2129,12 +2126,7 @@ SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
	if (!page)
		return -ENOMEM;

	read_lock(&current->fs->lock);
	pwd = current->fs->pwd;
	path_get(&pwd);
	root = current->fs->root;
	path_get(&root);
	read_unlock(&current->fs->lock);
	get_fs_root_and_pwd(current->fs, &root, &pwd);

	error = -ENOENT;
	spin_lock(&dcache_lock);
+1 −6
Original line number Diff line number Diff line
@@ -106,12 +106,7 @@ struct fs_struct *copy_fs_struct(struct fs_struct *old)
		fs->in_exec = 0;
		rwlock_init(&fs->lock);
		fs->umask = old->umask;
		read_lock(&old->lock);
		fs->root = old->root;
		path_get(&old->root);
		fs->pwd = old->pwd;
		path_get(&old->pwd);
		read_unlock(&old->lock);
		get_fs_root_and_pwd(old, &fs->root, &fs->pwd);
	}
	return fs;
}
+3 −12
Original line number Diff line number Diff line
@@ -483,13 +483,8 @@ ok:

static __always_inline void set_root(struct nameidata *nd)
{
	if (!nd->root.mnt) {
		struct fs_struct *fs = current->fs;
		read_lock(&fs->lock);
		nd->root = fs->root;
		path_get(&nd->root);
		read_unlock(&fs->lock);
	}
	if (!nd->root.mnt)
		get_fs_root(current->fs, &nd->root);
}

static int link_path_walk(const char *, struct nameidata *);
@@ -1015,11 +1010,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, struct namei
		nd->path = nd->root;
		path_get(&nd->root);
	} else if (dfd == AT_FDCWD) {
		struct fs_struct *fs = current->fs;
		read_lock(&fs->lock);
		nd->path = fs->pwd;
		path_get(&fs->pwd);
		read_unlock(&fs->lock);
		get_fs_pwd(current->fs, &nd->path);
	} else {
		struct dentry *dentry;

+1 −4
Original line number Diff line number Diff line
@@ -2213,10 +2213,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
		goto out1;
	}

	read_lock(&current->fs->lock);
	root = current->fs->root;
	path_get(&current->fs->root);
	read_unlock(&current->fs->lock);
	get_fs_root(current->fs, &root);
	down_write(&namespace_sem);
	mutex_lock(&old.dentry->d_inode->i_mutex);
	error = -EINVAL;
Loading