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
..
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
Makefile
[NFS] [PATCH] nfs: tiny makefile cleanup
2007-10-09 17:15:36 -04: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