All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fengguang Wu <fengguang.wu@intel.com>
To: Jan Kara <jack@suse.cz>
Cc: linux-fsdevel@vger.kernel.org, Dan Duval <dan.duval@oracle.com>,
	trond.myklebust@primarydata.com, chuck.lever@oracle.com,
	Jan Kara <jack@suse.cz>
Subject: Re: [PATCH] writeback: Fix data corruption on NFS
Date: Sat, 14 Dec 2013 13:45:39 +0800	[thread overview]
Message-ID: <20131214054539.GA21310@localhost> (raw)
In-Reply-To: <1386791976-2286-1-git-send-email-jack@suse.cz>

On Wed, Dec 11, 2013 at 08:59:36PM +0100, Jan Kara wrote:
> Commit 4f8ad655dbc8 "writeback: Refactor writeback_single_inode()" added
> a condition to skip clean inode. However this is wrong in WB_SYNC_ALL
> mode because there we also want to wait for outstanding writeback on
> possibly clean inode. This was causing occasional data corruption issues
> on NFS because it uses sync_inode() to make sure all outstanding writes
> are flushed to the server before truncating the inode and with
> sync_inode() returning prematurely file was sometimes extended back
> by an outstanding write after it was truncated.
> 
> So modify the test to also check for pages under writeback in
> WB_SYNC_ALL mode.

Applied to the writeback tree. Thank you, Jan!

Regards,
Fengguang

> CC: stable@vger.kernel.org # >= 3.5
> Fixes: 4f8ad655dbc82cf05d2edc11e66b78a42d38bf93
> Reported-and-tested-by: Dan Duval <dan.duval@oracle.com>
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  fs/fs-writeback.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
>  Fenguang, can you please merge this patch? Thanks!
> 
> diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
> index 1f4a10ece2f1..e0259a163f98 100644
> --- a/fs/fs-writeback.c
> +++ b/fs/fs-writeback.c
> @@ -516,13 +516,16 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb,
>  	}
>  	WARN_ON(inode->i_state & I_SYNC);
>  	/*
> -	 * Skip inode if it is clean. We don't want to mess with writeback
> -	 * lists in this function since flusher thread may be doing for example
> -	 * sync in parallel and if we move the inode, it could get skipped. So
> -	 * here we make sure inode is on some writeback list and leave it there
> -	 * unless we have completely cleaned the inode.
> +	 * Skip inode if it is clean and we have no outstanding writeback in
> +	 * WB_SYNC_ALL mode. We don't want to mess with writeback lists in this
> +	 * function since flusher thread may be doing for example sync in
> +	 * parallel and if we move the inode, it could get skipped. So here we
> +	 * make sure inode is on some writeback list and leave it there unless
> +	 * we have completely cleaned the inode.
>  	 */
> -	if (!(inode->i_state & I_DIRTY))
> +	if (!(inode->i_state & I_DIRTY) &&
> +	    (wbc->sync_mode != WB_SYNC_ALL ||
> +	     !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_WRITEBACK)))
>  		goto out;
>  	inode->i_state |= I_SYNC;
>  	spin_unlock(&inode->i_lock);
> -- 
> 1.8.1.4

  reply	other threads:[~2013-12-15  2:56 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-11 19:59 [PATCH] writeback: Fix data corruption on NFS Jan Kara
2013-12-14  5:45 ` Fengguang Wu [this message]
2014-01-13 10:58   ` Jan Kara
2014-01-13 11:22     ` Fengguang Wu

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=20131214054539.GA21310@localhost \
    --to=fengguang.wu@intel.com \
    --cc=chuck.lever@oracle.com \
    --cc=dan.duval@oracle.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=trond.myklebust@primarydata.com \
    /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.