• Trond Myklebust's avatar
    NFS: Fix a potential file corruption issue when writing · 5d47a356
    Trond Myklebust authored
    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: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
    5d47a356
write.c 39.2 KB