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

Commit 421748ec authored by Al Viro's avatar Al Viro
Browse files

[PATCH] assorted path_lookup() -> kern_path() conversions



more nameidata eviction

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a63bb996
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -1268,33 +1268,33 @@ EXPORT_SYMBOL(ioctl_by_bdev);
 * namespace if possible and return it.  Return ERR_PTR(error)
 * otherwise.
 */
struct block_device *lookup_bdev(const char *path)
struct block_device *lookup_bdev(const char *pathname)
{
	struct block_device *bdev;
	struct inode *inode;
	struct nameidata nd;
	struct path path;
	int error;

	if (!path || !*path)
	if (!pathname || !*pathname)
		return ERR_PTR(-EINVAL);

	error = path_lookup(path, LOOKUP_FOLLOW, &nd);
	error = kern_path(pathname, LOOKUP_FOLLOW, &path);
	if (error)
		return ERR_PTR(error);

	inode = nd.path.dentry->d_inode;
	inode = path.dentry->d_inode;
	error = -ENOTBLK;
	if (!S_ISBLK(inode->i_mode))
		goto fail;
	error = -EACCES;
	if (nd.path.mnt->mnt_flags & MNT_NODEV)
	if (path.mnt->mnt_flags & MNT_NODEV)
		goto fail;
	error = -ENOMEM;
	bdev = bd_acquire(inode);
	if (!bdev)
		goto fail;
out:
	path_put(&nd.path);
	path_put(&path);
	return bdev;
fail:
	bdev = ERR_PTR(error);
+8 −8
Original line number Diff line number Diff line
@@ -108,18 +108,18 @@ static int create_link(struct config_item *parent_item,
}


static int get_target(const char *symname, struct nameidata *nd,
static int get_target(const char *symname, struct path *path,
		      struct config_item **target)
{
	int ret;

	ret = path_lookup(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, nd);
	ret = kern_path(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, path);
	if (!ret) {
		if (nd->path.dentry->d_sb == configfs_sb) {
			*target = configfs_get_config_item(nd->path.dentry);
		if (path->dentry->d_sb == configfs_sb) {
			*target = configfs_get_config_item(path->dentry);
			if (!*target) {
				ret = -ENOENT;
				path_put(&nd->path);
				path_put(path);
			}
		} else
			ret = -EPERM;
@@ -132,7 +132,7 @@ static int get_target(const char *symname, struct nameidata *nd,
int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
{
	int ret;
	struct nameidata nd;
	struct path path;
	struct configfs_dirent *sd;
	struct config_item *parent_item;
	struct config_item *target_item;
@@ -159,7 +159,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna
	    !type->ct_item_ops->allow_link)
		goto out_put;

	ret = get_target(symname, &nd, &target_item);
	ret = get_target(symname, &path, &target_item);
	if (ret)
		goto out_put;

@@ -174,7 +174,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna
	}

	config_item_put(target_item);
	path_put(&nd.path);
	path_put(&path);

out_put:
	config_item_put(parent_item);
+9 −14
Original line number Diff line number Diff line
@@ -471,31 +471,26 @@ ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent)
 */
static int ecryptfs_read_super(struct super_block *sb, const char *dev_name)
{
	struct path path;
	int rc;
	struct nameidata nd;
	struct dentry *lower_root;
	struct vfsmount *lower_mnt;

	memset(&nd, 0, sizeof(struct nameidata));
	rc = path_lookup(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &nd);
	rc = kern_path(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path);
	if (rc) {
		ecryptfs_printk(KERN_WARNING, "path_lookup() failed\n");
		goto out;
	}
	lower_root = nd.path.dentry;
	lower_mnt = nd.path.mnt;
	ecryptfs_set_superblock_lower(sb, lower_root->d_sb);
	sb->s_maxbytes = lower_root->d_sb->s_maxbytes;
	sb->s_blocksize = lower_root->d_sb->s_blocksize;
	ecryptfs_set_dentry_lower(sb->s_root, lower_root);
	ecryptfs_set_dentry_lower_mnt(sb->s_root, lower_mnt);
	rc = ecryptfs_interpose(lower_root, sb->s_root, sb, 0);
	ecryptfs_set_superblock_lower(sb, path.dentry->d_sb);
	sb->s_maxbytes = path.dentry->d_sb->s_maxbytes;
	sb->s_blocksize = path.dentry->d_sb->s_blocksize;
	ecryptfs_set_dentry_lower(sb->s_root, path.dentry);
	ecryptfs_set_dentry_lower_mnt(sb->s_root, path.mnt);
	rc = ecryptfs_interpose(path.dentry, sb->s_root, sb, 0);
	if (rc)
		goto out_free;
	rc = 0;
	goto out;
out_free:
	path_put(&nd.path);
	path_put(&path);
out:
	return rc;
}
+10 −8
Original line number Diff line number Diff line
@@ -711,28 +711,30 @@ static struct sock *unix_find_other(struct net *net,
				    int type, unsigned hash, int *error)
{
	struct sock *u;
	struct nameidata nd;
	struct path path;
	int err = 0;

	if (sunname->sun_path[0]) {
		err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd);
		struct inode *inode;
		err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path);
		if (err)
			goto fail;
		err = vfs_permission(&nd, MAY_WRITE);
		inode = path.dentry->d_inode;
		err = inode_permission(inode, MAY_WRITE);
		if (err)
			goto put_fail;

		err = -ECONNREFUSED;
		if (!S_ISSOCK(nd.path.dentry->d_inode->i_mode))
		if (!S_ISSOCK(inode->i_mode))
			goto put_fail;
		u = unix_find_socket_byinode(net, nd.path.dentry->d_inode);
		u = unix_find_socket_byinode(net, inode);
		if (!u)
			goto put_fail;

		if (u->sk_type == type)
			touch_atime(nd.path.mnt, nd.path.dentry);
			touch_atime(path.mnt, path.dentry);

		path_put(&nd.path);
		path_put(&path);

		err=-EPROTOTYPE;
		if (u->sk_type != type) {
@@ -753,7 +755,7 @@ static struct sock *unix_find_other(struct net *net,
	return u;

put_fail:
	path_put(&nd.path);
	path_put(&path);
fail:
	*error=err;
	return NULL;