From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Jan Kara <jack@suse.cz>
Subject: [PATCH 3.12 11/27] writeback: Fix data corruption on NFS
Date: Thu, 23 Jan 2014 11:06:48 -0800 [thread overview]
Message-ID: <20140123190649.861199315@linuxfoundation.org> (raw)
In-Reply-To: <20140123190648.720195687@linuxfoundation.org>
3.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <jack@suse.cz>
commit f9b0e058cbd04ada76b13afffa7e1df830543c24 upstream.
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.
Fixes: 4f8ad655dbc82cf05d2edc11e66b78a42d38bf93
Reported-and-tested-by: Dan Duval <dan.duval@oracle.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
fs/fs-writeback.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -510,13 +510,16 @@ writeback_single_inode(struct inode *ino
}
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);
next prev parent reply other threads:[~2014-01-23 19:06 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-23 19:06 [PATCH 3.12 00/27] 3.12.9-stable review Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 01/27] Revert "ACPI: Add BayTrail SoC GPIO and LPSS ACPI IDs" Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 02/27] perf/x86/amd/ibs: Fix waking up from S3 for AMD family 10h Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 03/27] GFS2: Increase i_writecount during gfs2_setattr_chown Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 04/27] staging: comedi: addi_apci_1032: fix subdevice type/flags bug Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 05/27] staging: comedi: adl_pci9111: fix incorrect irq passed to request_irq() Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 06/27] vfs: In d_path dont call d_dname on a mount point Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 07/27] vfs: Fix a regression in mounting proc Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 08/27] fork: Allow CLONE_PARENT after setns(CLONE_NEWPID) Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 09/27] i2c: Re-instate body of i2c_parent_is_i2c_adapter() Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 10/27] hwmon: (coretemp) Fix truncated name of alarm attributes Greg Kroah-Hartman
2014-01-23 19:06 ` Greg Kroah-Hartman [this message]
2014-01-23 19:06 ` [PATCH 3.12 12/27] SELinux: Fix possible NULL pointer dereference in selinux_inode_permission() Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 13/27] thp: fix copy_page_rep GPF by testing is_huge_zero_pmd once only Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 14/27] ftrace/x86: Load ftrace_ops in parameter not the variable holding it Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 15/27] crash_dump: fix compilation error (on MIPS at least) Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 16/27] mm: fix crash when using XFS on loopback Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 17/27] nilfs2: fix segctor bug that causes file system corruption Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 18/27] drm/i915: fix DDI PLLs HW state readout code Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 19/27] md: fix problem when adding device to read-only array with bitmap Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 20/27] md/raid10: fix bug when raid10 recovery fails to recover a block Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 21/27] md/raid10: fix two bugs in handling of known-bad-blocks Greg Kroah-Hartman
2014-01-23 19:06 ` [PATCH 3.12 22/27] md/raid5: Fix possible confusion when multiple write errors occur Greg Kroah-Hartman
2014-01-23 19:07 ` [PATCH 3.12 23/27] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL Greg Kroah-Hartman
2014-01-23 19:07 ` [PATCH 3.12 24/27] serial: amba-pl011: use port lock to guard control register access Greg Kroah-Hartman
2014-01-23 19:07 ` [PATCH 3.12 25/27] ARM: 7934/1: DT/kernel: fix arch_match_cpu_phys_id to avoid erroneous match Greg Kroah-Hartman
2014-01-23 19:07 ` [PATCH 3.12 27/27] ARM: 7938/1: OMAP4/highbank: Flush L2 cache before disabling Greg Kroah-Hartman
2014-01-23 23:20 ` [PATCH 3.12 00/27] 3.12.9-stable review Guenter Roeck
2014-01-24 4:11 ` Greg Kroah-Hartman
2014-01-24 5:17 ` Guenter Roeck
2014-01-24 15:19 ` Shuah Khan
2014-01-24 19:39 ` Radim Krčmář
2014-01-25 0:05 ` Greg Kroah-Hartman
2014-02-03 13:36 ` Luis Henriques
2014-01-25 14:08 ` Satoru Takeuchi
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=20140123190649.861199315@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=jack@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.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: 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.