Commit d36f2487 authored by Miklos Szeredi's avatar Miklos Szeredi

fuse: don't use inode in fuse_do_ioctl() helper

Create a helper for sending an IOCTL request that doesn't use a struct
inode.

This prepares this function for use by CUSE, where the inode is not
owned by a fuse filesystem.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
parent 8b0797a4
...@@ -1647,12 +1647,11 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov, ...@@ -1647,12 +1647,11 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov,
* limits ioctl data transfers to well-formed ioctls and is the forced * limits ioctl data transfers to well-formed ioctls and is the forced
* behavior for all FUSE servers. * behavior for all FUSE servers.
*/ */
static long fuse_file_do_ioctl(struct file *file, unsigned int cmd, static long fuse_do_ioctl(struct file *file, unsigned int cmd,
unsigned long arg, unsigned int flags) unsigned long arg, unsigned int flags)
{ {
struct inode *inode = file->f_dentry->d_inode;
struct fuse_file *ff = file->private_data; struct fuse_file *ff = file->private_data;
struct fuse_conn *fc = get_fuse_conn(inode); struct fuse_conn *fc = ff->fc;
struct fuse_ioctl_in inarg = { struct fuse_ioctl_in inarg = {
.fh = ff->fh, .fh = ff->fh,
.cmd = cmd, .cmd = cmd,
...@@ -1671,13 +1670,6 @@ static long fuse_file_do_ioctl(struct file *file, unsigned int cmd, ...@@ -1671,13 +1670,6 @@ static long fuse_file_do_ioctl(struct file *file, unsigned int cmd,
/* assume all the iovs returned by client always fits in a page */ /* assume all the iovs returned by client always fits in a page */
BUILD_BUG_ON(sizeof(struct iovec) * FUSE_IOCTL_MAX_IOV > PAGE_SIZE); BUILD_BUG_ON(sizeof(struct iovec) * FUSE_IOCTL_MAX_IOV > PAGE_SIZE);
if (!fuse_allow_task(fc, current))
return -EACCES;
err = -EIO;
if (is_bad_inode(inode))
goto out;
err = -ENOMEM; err = -ENOMEM;
pages = kzalloc(sizeof(pages[0]) * FUSE_MAX_PAGES_PER_REQ, GFP_KERNEL); pages = kzalloc(sizeof(pages[0]) * FUSE_MAX_PAGES_PER_REQ, GFP_KERNEL);
iov_page = alloc_page(GFP_KERNEL); iov_page = alloc_page(GFP_KERNEL);
...@@ -1738,7 +1730,7 @@ static long fuse_file_do_ioctl(struct file *file, unsigned int cmd, ...@@ -1738,7 +1730,7 @@ static long fuse_file_do_ioctl(struct file *file, unsigned int cmd,
/* okay, let's send it to the client */ /* okay, let's send it to the client */
req->in.h.opcode = FUSE_IOCTL; req->in.h.opcode = FUSE_IOCTL;
req->in.h.nodeid = get_node_id(inode); req->in.h.nodeid = ff->nodeid;
req->in.numargs = 1; req->in.numargs = 1;
req->in.args[0].size = sizeof(inarg); req->in.args[0].size = sizeof(inarg);
req->in.args[0].value = &inarg; req->in.args[0].value = &inarg;
...@@ -1822,16 +1814,31 @@ static long fuse_file_do_ioctl(struct file *file, unsigned int cmd, ...@@ -1822,16 +1814,31 @@ static long fuse_file_do_ioctl(struct file *file, unsigned int cmd,
return err ? err : outarg.result; return err ? err : outarg.result;
} }
static long fuse_file_ioctl_common(struct file *file, unsigned int cmd,
unsigned long arg, unsigned int flags)
{
struct inode *inode = file->f_dentry->d_inode;
struct fuse_conn *fc = get_fuse_conn(inode);
if (!fuse_allow_task(fc, current))
return -EACCES;
if (is_bad_inode(inode))
return -EIO;
return fuse_do_ioctl(file, cmd, arg, flags);
}
static long fuse_file_ioctl(struct file *file, unsigned int cmd, static long fuse_file_ioctl(struct file *file, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
return fuse_file_do_ioctl(file, cmd, arg, 0); return fuse_file_ioctl_common(file, cmd, arg, 0);
} }
static long fuse_file_compat_ioctl(struct file *file, unsigned int cmd, static long fuse_file_compat_ioctl(struct file *file, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
return fuse_file_do_ioctl(file, cmd, arg, FUSE_IOCTL_COMPAT); return fuse_file_ioctl_common(file, cmd, arg, FUSE_IOCTL_COMPAT);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment