forked from Minki/linux
[PATCH] assorted path_lookup() -> kern_path() conversions
more nameidata eviction Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
a63bb99660
commit
421748ecde
@ -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);
|
||||
|
@ -108,18 +108,18 @@ out:
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
@ -471,31 +471,26 @@ out:
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user