From: Anand Avati <avati-+FkPdpiNhgJBDgjK7y7TUQ@public.gmane.org> To: <miklos-sUDqSbJrdHQHWmgEVkV9KA@public.gmane.org> Cc: fuse-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Anand Avati <avati-+FkPdpiNhgJBDgjK7y7TUQ@public.gmane.org> Subject: [PATCH 2/2] fuse: permit O_DIRECT flag in open() Date: Fri, 22 Jul 2011 01:33:26 -0700 [thread overview] Message-ID: <1311323606-15040-2-git-send-email-avati@gluster.com> (raw) In-Reply-To: <1311323606-15040-1-git-send-email-avati-+FkPdpiNhgJBDgjK7y7TUQ@public.gmane.org> but do not permit setting of O_DIRECT flag via fcntl() (or unsetting) --- fs/fuse/file.c | 27 +++++++++++++++++++++++---- 1 files changed, 23 insertions(+), 4 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 82a6646..f30a7c6 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -154,6 +154,18 @@ int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file, return err; } + if (file->f_flags & O_DIRECT) { + /* set fuse_direct_io_file_operations as fops in + fuse_finish_open as though the FS enforced direct_io + */ + outarg.open_flags |= FOPEN_DIRECT_IO; + + /* make VFS believe we don't support O_DIRECT till we + implement a_ops->direct_IO + */ + file->f_flags &= ~O_DIRECT; + } + if (isdir) outarg.open_flags &= ~FOPEN_DIRECT_IO; @@ -193,10 +205,6 @@ int fuse_open_common(struct inode *inode, struct file *file, bool isdir) struct fuse_conn *fc = get_fuse_conn(inode); int err; - /* VFS checks this, but only _after_ ->open() */ - if (file->f_flags & O_DIRECT) - return -EINVAL; - err = generic_file_open(inode, file); if (err) return err; @@ -2132,6 +2140,15 @@ int fuse_notify_poll_wakeup(struct fuse_conn *fc, return 0; } + +static int fuse_check_flags(struct file *filp, int flags) +{ + if ((filp->f_flags ^ flags) & O_DIRECT) + return -EINVAL; + return 0; +} + + static const struct file_operations fuse_file_operations = { .llseek = fuse_file_llseek, .read = do_sync_read, @@ -2149,6 +2166,7 @@ static const struct file_operations fuse_file_operations = { .unlocked_ioctl = fuse_file_ioctl, .compat_ioctl = fuse_file_compat_ioctl, .poll = fuse_file_poll, + .check_flags = fuse_check_flags, }; static const struct file_operations fuse_direct_io_file_operations = { @@ -2165,6 +2183,7 @@ static const struct file_operations fuse_direct_io_file_operations = { .unlocked_ioctl = fuse_file_ioctl, .compat_ioctl = fuse_file_compat_ioctl, .poll = fuse_file_poll, + .check_flags = fuse_check_flags, /* no splice_read */ }; -- 1.7.4.4 ------------------------------------------------------------------------------ 10 Tips for Better Web Security Learn 10 ways to better secure your business today. Topics covered include: Web security, SSL, hacker attacks & Denial of Service (DoS), private keys, security Microsoft Exchange, secure Instant Messaging, and much more. http://www.accelacomm.com/jaw/sfnl/114/51426210/
WARNING: multiple messages have this Message-ID (diff)
From: Anand Avati <avati@gluster.com> To: <miklos@szeredi.hu> Cc: <fuse-devel@lists.sourceforge.net>, <linux-fsdevel@vger.kernel.org>, <linux-nfs@vger.kernel.org>, Anand Avati <avati@gluster.com> Subject: [PATCH 2/2] fuse: permit O_DIRECT flag in open() Date: Fri, 22 Jul 2011 01:33:26 -0700 [thread overview] Message-ID: <1311323606-15040-2-git-send-email-avati@gluster.com> (raw) In-Reply-To: <1311323606-15040-1-git-send-email-avati@gluster.com> but do not permit setting of O_DIRECT flag via fcntl() (or unsetting) --- fs/fuse/file.c | 27 +++++++++++++++++++++++---- 1 files changed, 23 insertions(+), 4 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 82a6646..f30a7c6 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -154,6 +154,18 @@ int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file, return err; } + if (file->f_flags & O_DIRECT) { + /* set fuse_direct_io_file_operations as fops in + fuse_finish_open as though the FS enforced direct_io + */ + outarg.open_flags |= FOPEN_DIRECT_IO; + + /* make VFS believe we don't support O_DIRECT till we + implement a_ops->direct_IO + */ + file->f_flags &= ~O_DIRECT; + } + if (isdir) outarg.open_flags &= ~FOPEN_DIRECT_IO; @@ -193,10 +205,6 @@ int fuse_open_common(struct inode *inode, struct file *file, bool isdir) struct fuse_conn *fc = get_fuse_conn(inode); int err; - /* VFS checks this, but only _after_ ->open() */ - if (file->f_flags & O_DIRECT) - return -EINVAL; - err = generic_file_open(inode, file); if (err) return err; @@ -2132,6 +2140,15 @@ int fuse_notify_poll_wakeup(struct fuse_conn *fc, return 0; } + +static int fuse_check_flags(struct file *filp, int flags) +{ + if ((filp->f_flags ^ flags) & O_DIRECT) + return -EINVAL; + return 0; +} + + static const struct file_operations fuse_file_operations = { .llseek = fuse_file_llseek, .read = do_sync_read, @@ -2149,6 +2166,7 @@ static const struct file_operations fuse_file_operations = { .unlocked_ioctl = fuse_file_ioctl, .compat_ioctl = fuse_file_compat_ioctl, .poll = fuse_file_poll, + .check_flags = fuse_check_flags, }; static const struct file_operations fuse_direct_io_file_operations = { @@ -2165,6 +2183,7 @@ static const struct file_operations fuse_direct_io_file_operations = { .unlocked_ioctl = fuse_file_ioctl, .compat_ioctl = fuse_file_compat_ioctl, .poll = fuse_file_poll, + .check_flags = fuse_check_flags, /* no splice_read */ }; -- 1.7.4.4
next prev parent reply other threads:[~2011-07-22 8:33 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-07-22 8:33 [PATCH 1/2] vfs: pass 'struct file *' as parameter to ->check_flags() methods Anand Avati 2011-07-22 8:33 ` Anand Avati [not found] ` <1311323606-15040-1-git-send-email-avati-+FkPdpiNhgJBDgjK7y7TUQ@public.gmane.org> 2011-07-22 8:33 ` Anand Avati [this message] 2011-07-22 8:33 ` [PATCH 2/2] fuse: permit O_DIRECT flag in open() Anand Avati 2011-07-22 13:33 ` Miklos Szeredi [not found] ` <87livqfnin.fsf-d8RdFUjzFsbxNFs70CDYszOMxtEWgIxa@public.gmane.org> 2011-07-22 15:02 ` Stef Bon 2011-07-22 15:02 ` Stef Bon 2011-07-22 13:26 ` [PATCH 1/2] vfs: pass 'struct file *' as parameter to ->check_flags() methods Miklos Szeredi 2011-07-22 13:26 ` Miklos Szeredi
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1311323606-15040-2-git-send-email-avati@gluster.com \ --to=avati-+fkpdpinhgjbdgjk7y7tuq@public.gmane.org \ --cc=fuse-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \ --cc=linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=miklos-sUDqSbJrdHQHWmgEVkV9KA@public.gmane.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.