From: Maxim Patlasov <mpatlasov@parallels.com>
To: Christoph Hellwig <hch@lst.de>, Al Viro <viro@zeniv.linux.org.uk>
Cc: Robert Baldyga <r.baldyga@samsung.com>,
Michal Nazarewicz <mina86@mina86.com>,
Felipe Balbi <balbi@ti.com>, <linux-aio@kvack.org>,
<linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH 09/12] fuse: handle synchronous iocbs internally
Date: Thu, 5 Mar 2015 18:54:09 -0800 [thread overview]
Message-ID: <54F916D1.1000808@parallels.com> (raw)
In-Reply-To: <1424714436-19371-10-git-send-email-hch@lst.de>
Reviewed-by: Maxim Patlasov <MPatlasov@parallels.com>
On 02/23/2015 10:00 AM, Christoph Hellwig wrote:
> Based on a patch from Maxim Patlasov <MPatlasov@parallels.com>.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/fuse/file.c | 51 +++++++++++++++++++++++++++++++--------------------
> fs/fuse/fuse_i.h | 1 +
> 2 files changed, 32 insertions(+), 20 deletions(-)
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index c01ec3b..f81d83e 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -528,6 +528,17 @@ static void fuse_release_user_pages(struct fuse_req *req, int write)
> }
> }
>
> +static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io)
> +{
> + if (io->err)
> + return io->err;
> +
> + if (io->bytes >= 0 && io->write)
> + return -EIO;
> +
> + return io->bytes < 0 ? io->size : io->bytes;
> +}
> +
> /**
> * In case of short read, the caller sets 'pos' to the position of
> * actual end of fuse request in IO request. Otherwise, if bytes_requested
> @@ -546,6 +557,7 @@ static void fuse_release_user_pages(struct fuse_req *req, int write)
> */
> static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
> {
> + bool is_sync = is_sync_kiocb(io->iocb);
> int left;
>
> spin_lock(&io->lock);
> @@ -555,27 +567,21 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
> io->bytes = pos;
>
> left = --io->reqs;
> + if (!left && is_sync)
> + complete(io->done);
> spin_unlock(&io->lock);
>
> - if (!left) {
> - long res;
> + if (!left && !is_sync) {
> + ssize_t res = fuse_get_res_by_io(io);
>
> - if (io->err)
> - res = io->err;
> - else if (io->bytes >= 0 && io->write)
> - res = -EIO;
> - else {
> - res = io->bytes < 0 ? io->size : io->bytes;
> + if (res >= 0) {
> + struct inode *inode = file_inode(io->iocb->ki_filp);
> + struct fuse_conn *fc = get_fuse_conn(inode);
> + struct fuse_inode *fi = get_fuse_inode(inode);
>
> - if (!is_sync_kiocb(io->iocb)) {
> - struct inode *inode = file_inode(io->iocb->ki_filp);
> - struct fuse_conn *fc = get_fuse_conn(inode);
> - struct fuse_inode *fi = get_fuse_inode(inode);
> -
> - spin_lock(&fc->lock);
> - fi->attr_version = ++fc->attr_version;
> - spin_unlock(&fc->lock);
> - }
> + spin_lock(&fc->lock);
> + fi->attr_version = ++fc->attr_version;
> + spin_unlock(&fc->lock);
> }
>
> aio_complete(io->iocb, res, 0);
> @@ -2801,6 +2807,7 @@ static ssize_t
> fuse_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
> loff_t offset)
> {
> + DECLARE_COMPLETION_ONSTACK(wait);
> ssize_t ret = 0;
> struct file *file = iocb->ki_filp;
> struct fuse_file *ff = file->private_data;
> @@ -2852,6 +2859,9 @@ fuse_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
> if (!is_sync_kiocb(iocb) && (offset + count > i_size) && rw == WRITE)
> io->async = false;
>
> + if (io->async && is_sync_kiocb(iocb))
> + io->done = &wait;
> +
> if (rw == WRITE)
> ret = __fuse_direct_write(io, iter, &pos);
> else
> @@ -2864,11 +2874,12 @@ fuse_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
> if (!is_sync_kiocb(iocb))
> return -EIOCBQUEUED;
>
> - ret = wait_on_sync_kiocb(iocb);
> - } else {
> - kfree(io);
> + wait_for_completion(&wait);
> + ret = fuse_get_res_by_io(io);
> }
>
> + kfree(io);
> +
> if (rw == WRITE) {
> if (ret > 0)
> fuse_write_update_size(inode, pos);
> diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> index 1cdfb07..7354dc1 100644
> --- a/fs/fuse/fuse_i.h
> +++ b/fs/fuse/fuse_i.h
> @@ -263,6 +263,7 @@ struct fuse_io_priv {
> int err;
> struct kiocb *iocb;
> struct file *file;
> + struct completion *done;
> };
>
> /**
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
next prev parent reply other threads:[~2015-03-06 2:54 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-23 18:00 [RFC] split struct kiocb Christoph Hellwig
2015-02-23 18:00 ` [PATCH 01/12] new helper: dup_iter() Christoph Hellwig
2015-02-23 18:00 ` [PATCH 02/12] move iov_iter.c from mm/ to lib/ Christoph Hellwig
2015-02-23 18:00 ` [PATCH 03/12] gadget/function/f_fs.c: close leaks Christoph Hellwig
2015-02-23 18:00 ` [PATCH 04/12] gadget/function/f_fs.c: use put iov_iter into io_data Christoph Hellwig
2015-02-23 18:00 ` [PATCH 05/12] gadget/function/f_fs.c: switch to ->{read,write}_iter() Christoph Hellwig
2015-02-23 18:00 ` [PATCH 06/12] gadgetfs: use-after-free in ->aio_read() Christoph Hellwig
2015-03-08 10:07 ` Ming Lei
2015-03-09 15:18 ` Michal Nazarewicz
2015-02-23 18:00 ` [PATCH 07/12] gadget: switch ep_io_operations to ->read_iter/->write_iter Christoph Hellwig
2015-02-23 18:00 ` [PATCH 08/12] fs: remove ki_nbytes Christoph Hellwig
2015-02-23 18:00 ` [PATCH 09/12] fuse: handle synchronous iocbs internally Christoph Hellwig
2015-03-06 2:54 ` Maxim Patlasov [this message]
2015-02-23 18:00 ` [PATCH 10/12] fs: don't allow to complete sync iocbs through aio_complete Christoph Hellwig
2015-02-23 18:00 ` [PATCH 11/12] fs: split generic and aio kiocb Christoph Hellwig
2015-02-23 18:00 ` [PATCH 12/12] fs: move struct kiocb to fs.h Christoph Hellwig
2015-02-23 21:20 ` [RFC] split struct kiocb Al Viro
2015-02-23 21:22 ` Christoph Hellwig
2015-02-23 21:39 ` Al Viro
2015-02-24 3:47 ` Al Viro
2015-02-23 21:23 ` Felipe Balbi
2015-02-23 21:42 ` Al Viro
2015-02-23 21:50 ` Felipe Balbi
2015-02-25 17:13 ` Felipe Balbi
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=54F916D1.1000808@parallels.com \
--to=mpatlasov@parallels.com \
--cc=balbi@ti.com \
--cc=hch@lst.de \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=mina86@mina86.com \
--cc=r.baldyga@samsung.com \
--cc=viro@zeniv.linux.org.uk \
/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: link
Be 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.