• Christoph Hellwig's avatar
    nfsd: special case truncates some more · 41f53350
    Christoph Hellwig authored
    Both the NFS protocols and the Linux VFS use a setattr operation with a
    bitmap of attributs to set to set various file attributes including the
    file size and the uid/gid.
    
    The Linux syscalls never mixes size updates with unrelated updates like
    the uid/gid, and some file systems like XFS and GFS2 rely on the fact
    that truncates might not update random other attributes, and many other
    file systems handle the case but do not update the different attributes
    in the same transaction.  NFSD on the other hand passes the attributes
    it gets on the wire more or less directly through to the VFS, leading to
    updates the file systems don't expect.  XFS at least has an assert on
    the allowed attributes, which caught an unusual NFS client setting the
    size and group at the same time.
    
    To handle this issue properly this switches nfsd to call vfs_truncate
    for size changes, and then handle all other attributes through
    notify_change.  As a side effect this also means less boilerplace code
    around the size change as we can now reuse the VFS code.
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    41f53350
vfs.c 49.5 KB