All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ashish Samant <ashish.samant@oracle.com>
To: linux-fsdevel@vger.kernel.org, fuse-devel@lists.sourceforge.net
Cc: miklos@szeredi.hu
Subject: Re: [PATCH] fuse: Dont set_page_dirty_lock() for ITER_BVEC pages for async_dio
Date: Mon, 10 Jul 2017 14:36:16 -0700	[thread overview]
Message-ID: <5963F350.6030309@oracle.com> (raw)
In-Reply-To: <1498177988-18688-1-git-send-email-ashish.samant@oracle.com>

Hi,

Any update here? This attempts to fix a real deadlock which happens as 
soon as a loop device is created in a fuse mount point with the 
async_dio mount option enabled.

Thanks,
Ashish

On 06/22/2017 05:33 PM, Ashish Samant wrote:
> 'Commit 8fba54aebbdf ("fuse: direct-io: don't dirty ITER_BVEC pages")'
> fixes the ITER_BVEC page deadlock for direct io in fuse but misses the
> async_dio case.
>
> Fix this by making should_dirty a fuse_io_priv parameter.
>
> Reported-by: Tiger Yang <tiger.yang@oracle.com>
> Signed-off-by: Ashish Samant <ashish.samant@oracle.com>
> ---
>   fs/fuse/file.c   | 8 +++++---
>   fs/fuse/fuse_i.h | 2 ++
>   2 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index 3ee4fdc..e865ac7 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -608,8 +608,9 @@ static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_req *req)
>   {
>   	struct fuse_io_priv *io = req->io;
>   	ssize_t pos = -1;
> +	bool should_dirty = io->should_dirty && !io->write;
>   
> -	fuse_release_user_pages(req, !io->write);
> +	fuse_release_user_pages(req, should_dirty);
>   
>   	if (io->write) {
>   		if (req->misc.write.in.size != req->misc.write.out.size)
> @@ -1316,7 +1317,6 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
>   		       loff_t *ppos, int flags)
>   {
>   	int write = flags & FUSE_DIO_WRITE;
> -	bool should_dirty = !write && iter_is_iovec(iter);
>   	int cuse = flags & FUSE_DIO_CUSE;
>   	struct file *file = io->file;
>   	struct inode *inode = file->f_mapping->host;
> @@ -1346,6 +1346,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
>   			inode_unlock(inode);
>   	}
>   
> +	io->should_dirty = !write && iter_is_iovec(iter);
>   	while (count) {
>   		size_t nres;
>   		fl_owner_t owner = current->files;
> @@ -1360,7 +1361,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
>   			nres = fuse_send_read(req, io, pos, nbytes, owner);
>   
>   		if (!io->async)
> -			fuse_release_user_pages(req, should_dirty);
> +			fuse_release_user_pages(req, io->should_dirty);
>   		if (req->out.h.error) {
>   			err = req->out.h.error;
>   			break;
> @@ -2872,6 +2873,7 @@ static inline loff_t fuse_round_up(loff_t off)
>   	io->size = 0;
>   	io->offset = offset;
>   	io->write = (iov_iter_rw(iter) == WRITE);
> +	io->should_dirty = true;
>   	io->err = 0;
>   	io->file = file;
>   	/*
> diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> index 1bd7ffd..2ef205e 100644
> --- a/fs/fuse/fuse_i.h
> +++ b/fs/fuse/fuse_i.h
> @@ -249,6 +249,7 @@ struct fuse_io_priv {
>   	size_t size;
>   	__u64 offset;
>   	bool write;
> +	bool should_dirty;
>   	int err;
>   	struct kiocb *iocb;
>   	struct file *file;
> @@ -261,6 +262,7 @@ struct fuse_io_priv {
>   	.refcnt = KREF_INIT(1),		\
>   	.async = 0,			\
>   	.file = f,			\
> +	.should_dirty = true,           \
>   }
>   
>   /**

  reply	other threads:[~2017-07-10 21:36 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-23  0:33 [PATCH] fuse: Dont set_page_dirty_lock() for ITER_BVEC pages for async_dio Ashish Samant
2017-07-10 21:36 ` Ashish Samant [this message]
2017-07-12 12:21   ` Miklos Szeredi
2017-07-13  2:29     ` Ashish Samant

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=5963F350.6030309@oracle.com \
    --to=ashish.samant@oracle.com \
    --cc=fuse-devel@lists.sourceforge.net \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    /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.