From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk,
Trond Myklebust <Trond.Myklebust@netapp.com>
Subject: [patch 03/38] NFS: Fix a potential file corruption issue when writing
Date: Fri, 22 Feb 2008 16:29:39 -0800 [thread overview]
Message-ID: <20080223002939.GD7268@suse.de> (raw)
In-Reply-To: <20080223002907.GA7268@suse.de>
[-- Attachment #1: nfs-fix-a-potential-file-corruption-issue-when-writing.patch --]
[-- Type: text/plain, Size: 2862 bytes --]
2.6.24-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Trond Myklebust <Trond.Myklebust@netapp.com>
patch 5d47a35600270e7115061cb1320ee60ae9bcb6b8 in mainline.
If the inode is flagged as having an invalid mapping, then we can't rely on
the PageUptodate() flag. Ensure that we don't use the "anti-fragmentation"
write optimisation in nfs_updatepage(), since that will cause NFS to write
out areas of the page that are no longer guaranteed to be up to date.
A potential corruption could occur in the following scenario:
client 1 client 2
=============== ===============
fd=open("f",O_CREAT|O_WRONLY,0644);
write(fd,"fubar\n",6); // cache last page
close(fd);
fd=open("f",O_WRONLY|O_APPEND);
write(fd,"foo\n",4);
close(fd);
fd=open("f",O_WRONLY|O_APPEND);
write(fd,"bar\n",4);
close(fd);
-----
The bug may lead to the file "f" reading 'fubar\n\0\0\0\nbar\n' because
client 2 does not update the cached page after re-opening the file for
write. Instead it keeps it marked as PageUptodate() until someone calls
invalidate_inode_pages2() (typically by calling read()).
The bug was introduced by commit 44b11874ff583b6e766a05856b04f3c492c32b84
"NFS: Separate metadata and page cache revalidation mechanisms"
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/nfs/write.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -701,6 +701,17 @@ int nfs_flush_incompatible(struct file *
}
/*
+ * If the page cache is marked as unsafe or invalid, then we can't rely on
+ * the PageUptodate() flag. In this case, we will need to turn off
+ * write optimisations that depend on the page contents being correct.
+ */
+static int nfs_write_pageuptodate(struct page *page, struct inode *inode)
+{
+ return PageUptodate(page) &&
+ !(NFS_I(inode)->cache_validity & (NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA));
+}
+
+/*
* Update and possibly write a cached page of an NFS file.
*
* XXX: Keep an eye on generic_file_read to make sure it doesn't do bad
@@ -721,10 +732,13 @@ int nfs_updatepage(struct file *file, st
(long long)(page_offset(page) +offset));
/* If we're not using byte range locks, and we know the page
- * is entirely in cache, it may be more efficient to avoid
- * fragmenting write requests.
+ * is up to date, it may be more efficient to extend the write
+ * to cover the entire page in order to avoid fragmentation
+ * inefficiencies.
*/
- if (PageUptodate(page) && inode->i_flock == NULL && !(file->f_mode & O_SYNC)) {
+ if (nfs_write_pageuptodate(page, inode) &&
+ inode->i_flock == NULL &&
+ !(file->f_mode & O_SYNC)) {
count = max(count + offset, nfs_page_length(page));
offset = 0;
}
--
next prev parent reply other threads:[~2008-02-23 0:34 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20080223001946.979768610@mini.kroah.org>
2008-02-23 0:29 ` [patch 00/38] 2.6.24-stable review Greg KH
2008-02-23 0:29 ` [patch 01/38] SPARC/SPARC64: Fix usage of .section .sched.text in assembler code Greg KH
2008-02-23 0:29 ` [patch 02/38] NETFILTER: nf_conntrack_tcp: conntrack reopening fix Greg KH
2008-02-23 0:29 ` Greg KH [this message]
2008-02-23 0:29 ` [patch 04/38] inotify: fix check for one-shot watches before destroying them Greg KH
2008-02-23 0:29 ` [patch 05/38] hugetlb: add locking for overcommit sysctl Greg KH
2008-02-23 0:29 ` [patch 06/38] quota: turn quotas off when remounting read-only Greg KH
2008-02-25 21:57 ` Jan Kara
2008-02-25 23:56 ` Greg KH
2008-02-23 0:29 ` [patch 07/38] XFS: Fix oops in xfs_file_readdir() Greg KH
2008-02-23 0:30 ` [patch 08/38] Fix dl2k constants Greg KH
2008-02-23 0:30 ` [patch 09/38] SCSI: sd: handle bad lba in sense information Greg KH
2008-02-23 0:30 ` [patch 10/38] TCP: Fix a bug in strategy_allowed_congestion_control Greg KH
2008-02-23 0:30 ` [patch 11/38] TC: oops in em_meta Greg KH
2008-02-23 0:30 ` [patch 12/38] SELinux: Fix double free in selinux_netlbl_sock_setsid() Greg KH
2008-02-23 0:30 ` [patch 13/38] PKT_SCHED: ematch: oops from uninitialized variable (resend) Greg KH
2008-02-23 0:30 ` [patch 14/38] NET: Add if_addrlabel.h to sanitized headers Greg KH
2008-02-23 0:30 ` [patch 15/38] IPV4: fib_trie: apply fixes from fib_hash Greg KH
2008-02-23 0:30 ` [patch 16/38] IPV4: fib: fix route replacement, fib_info is shared Greg KH
2008-02-23 0:30 ` [patch 17/38] IPCOMP: Fix reception of incompressible packets Greg KH
2008-02-23 0:30 ` [patch 18/38] IPCOMP: Fetch nexthdr before ipch is destroyed Greg KH
2008-02-23 0:30 ` [patch 19/38] INET_DIAG: Fix inet_diag_lock_handler error path Greg KH
2008-02-23 0:30 ` [patch 20/38] INET: Prevent out-of-sync truesize on ip_fragment slow path Greg KH
2008-02-23 0:30 ` [patch 21/38] BLUETOOTH: Add conn add/del workqueues to avoid connection fail Greg KH
2008-02-23 0:30 ` [patch 22/38] AUDIT: Increase skb->truesize in audit_expand Greg KH
2008-02-23 0:30 ` [patch 23/38] Be more robust about bad arguments in get_user_pages() Greg KH
2008-02-23 0:31 ` [patch 24/38] Disable G5 NAP mode during SMU commands on U3 Greg KH
2008-02-23 0:31 ` [patch 25/38] hrtimer: fix *rmtp handling in hrtimer_nanosleep() Greg KH
2008-02-23 0:31 ` [patch 26/38] hrtimer: fix *rmtp/restarts handling in compat_sys_nanosleep() Greg KH
2008-02-23 0:31 ` [patch 27/38] SLUB: Deal with annoying gcc warning on kfree() Greg KH
2008-02-23 0:31 ` [patch 28/38] hrtimer: check relative timeouts for overflow Greg KH
2008-02-23 0:31 ` [patch 29/38] hrtimer: catch expired CLOCK_REALTIME timers early Greg KH
2008-02-23 0:31 ` [patch 30/38] genirq: do not leave interupts enabled on free_irq Greg KH
2008-02-23 0:31 ` [patch 31/38] S390: Fix futex_atomic_cmpxchg_std inline assembly Greg KH
2008-02-23 0:31 ` [patch 32/38] USB: fix pm counter leak in usblp Greg KH
2008-02-23 0:31 ` [patch 33/38] SCSI: gdth: scan for scsi devices Greg KH
2008-02-23 3:02 ` Boaz Harrosh
2008-02-23 3:52 ` [stable] " Greg KH
2008-02-23 4:15 ` James Bottomley
2008-02-23 0:31 ` [patch 34/38] kbuild: allow -fstack-protector to take effect Greg KH
2008-02-23 0:46 ` Arjan van de Ven
2008-02-23 0:53 ` Greg KH
2008-02-23 3:41 ` Sam Ravnborg
2008-02-23 3:53 ` [stable] " Greg KH
2008-02-23 6:29 ` Sam Ravnborg
2008-02-23 0:31 ` [patch 35/38] PCMCIA: Fix station address detection in smc Greg KH
2008-02-23 0:31 ` [patch 36/38] POWERPC: Revert chrp_pci_fixup_vt8231_ata devinit to fix libata on pegasos Greg KH
2008-02-23 0:31 ` [patch 37/38] bonding: fix NULL pointer deref in startup processing Greg KH
2008-02-23 0:31 ` [patch 38/38] x86_64: CPA, fix cache attribute inconsistency bug Greg KH
2008-02-23 16:56 ` [patch 00/38] 2.6.24-stable review Chuck Ebbert
2008-02-24 14:55 ` Uli Luckas
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=20080223002939.GD7268@suse.de \
--to=gregkh@suse.de \
--cc=Trond.Myklebust@netapp.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=zwane@arm.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.