linux/fs/nfs
Trond Myklebust 5d47a35600 NFS: Fix a potential file corruption issue when writing
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
invaldate_inode_pages2() (typically by calling read()).

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
2008-02-07 19:20:20 -05:00
..
Makefile [NFS] [PATCH] nfs: tiny makefile cleanup 2007-10-09 17:15:36 -04:00
callback.c svc: Change services to use new svc_create_xprt service 2008-02-01 16:42:09 -05:00
callback.h NFS: Change cb_recallargs to pass "struct sockaddr *" instead of sockaddr_in 2008-01-30 02:05:55 -05:00
callback_proc.c NFSv4: Iterate through all nfs_clients when the server recalls a delegation 2008-01-30 02:06:12 -05:00
callback_xdr.c NFS: Change cb_recallargs to pass "struct sockaddr *" instead of sockaddr_in 2008-01-30 02:05:55 -05:00
client.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
delegation.c NFSv4: Deal more correctly with duplicate delegations 2008-01-30 02:06:12 -05:00
delegation.h NFS: Add an asynchronous delegreturn operation for use in nfs_clear_inode 2008-01-30 02:06:12 -05:00
dir.c NFS: Fix a potential race between umount and nfs_access_cache_shrinker() 2008-01-30 02:06:12 -05:00
direct.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
file.c NFS: nfs_write_end clean up 2008-01-30 02:06:02 -05:00
getroot.c Convert ERR_PTR(PTR_ERR(p)) instances to ERR_CAST(p) 2008-02-07 08:42:26 -08:00
idmap.c NFS: Use size_t for storing name lengths 2008-01-30 02:06:01 -05:00
inode.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
internal.h NFSv4: Iterate through all nfs_clients when the server recalls a delegation 2008-01-30 02:06:12 -05:00
iostat.h NFSv4: Fix an oops in nfs4_fill_super 2006-03-20 13:44:48 -05:00
mount_clnt.c NFS: Switch from intr mount option to TASK_KILLABLE 2007-12-06 17:40:25 -05:00
namespace.c NFS: Remove the redundant nfs_client->cl_nfsversion 2008-01-30 02:05:49 -05:00
nfs2xdr.c NFS: Use unsigned intermediates for manipulating header lengths (NFSv2 XDR) 2008-01-30 02:05:44 -05:00
nfs3acl.c NFS: Remove nfs_begin_data_update/nfs_end_data_update 2007-10-09 17:19:53 -04:00
nfs3proc.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
nfs3xdr.c NFS: Use unsigned intermediates for manipulating header lengths (NFSv3 XDR) 2008-01-30 02:05:44 -05:00
nfs4_fs.h NFSv4: Give the lock stateid its own sequence queue 2008-01-10 13:35:32 -08:00
nfs4namespace.c NFS: Adjust nfs_clone_mount structure to store "struct sockaddr *" 2008-01-30 02:05:56 -05:00
nfs4proc.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
nfs4renewd.c NFSv4: Fix circular locking dependency in nfs4_kill_renewd 2008-01-03 09:37:16 -05:00
nfs4state.c NFS: eliminate NIPQUAD(clp->cl_addr.sin_addr) 2008-01-30 02:05:52 -05:00
nfs4xdr.c NFS: Ensure NFSv4 SETCLIENTID send buffer is large enough 2008-01-30 02:05:51 -05:00
nfsroot.c NFS: Switch from intr mount option to TASK_KILLABLE 2007-12-06 17:40:25 -05:00
pagelist.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
proc.c NLM/NFS: Use cached nlm_host when calling nlmclnt_proc() 2008-01-30 02:06:07 -05:00
read.c Pagecache zeroing: zero_user_segment, zero_user_segments and zero_user 2008-02-05 09:44:13 -08:00
super.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
symlink.c header cleaning: don't include smp_lock.h when not used 2007-05-08 11:15:07 -07:00
sysctl.c [PATCH] nfs: fix congestion control 2007-03-16 19:25:05 -07:00
unlink.c NFS/SUNRPC: Convert all users of rpc_call_setup() 2008-01-30 02:05:32 -05:00
write.c NFS: Fix a potential file corruption issue when writing 2008-02-07 19:20:20 -05:00