summaryrefslogtreecommitdiff
path: root/fs/nfs/dir.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2008-02-08 01:24:07 +0300
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-02-08 03:20:20 +0300
commit5d47a35600270e7115061cb1320ee60ae9bcb6b8 (patch)
tree63b6ac010939b45ce53e65dedae68f1296bd98e7 /fs/nfs/dir.c
parentdf922075f2a55b1ae71a6fe589c1cc1b91381f4f (diff)
downloadlinux-5d47a35600270e7115061cb1320ee60ae9bcb6b8.tar.xz
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>
Diffstat (limited to 'fs/nfs/dir.c')
0 files changed, 0 insertions, 0 deletions