• Scott Mayhew's avatar
    nfs: Fix cache_validity check in nfs_write_pageuptodate() · 18dd78c4
    Scott Mayhew authored
    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>
    Cc: <stable@vger.kernel.org> # v3.11+
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    18dd78c4
write.c 44.1 KB