• Scott Mayhew's avatar
    nfs: Fix cache_validity check in nfs_write_pageuptodate() · b7c3aabc
    Scott Mayhew authored
    commit 18dd78c4 upstream.
    
    NFS_INO_INVALID_DATA cannot be ignored, even if we have a delegation.
    
    We're still having some problems with data corruption when multiple
    clients are appending to a file and those clients are being granted
    write delegations on open.
    
    To reproduce:
    
    Client A:
    vi /mnt/`hostname -s`
    while :; do echo "XXXXXXXXXXXXXXX" >>/mnt/file; sleep $(( $RANDOM % 5 )); done
    
    Client B:
    vi /mnt/`hostname -s`
    while :; do echo "YYYYYYYYYYYYYYY" >>/mnt/file; sleep $(( $RANDOM % 5 )); done
    
    What's happening is that in nfs_update_inode() we're recognizing that
    the file size has changed and we're setting NFS_INO_INVALID_DATA
    accordingly, but then we ignore the cache_validity flags in
    nfs_write_pageuptodate() because we have a delegation.  As a result,
    in nfs_updatepage() we're extending the write to cover the full page
    even though we've not read in the data to begin with.
    Signed-off-by: default avatarScott Mayhew <smayhew@redhat.com>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    b7c3aabc
write.c 49.9 KB