• Brian Foster's avatar
    xfs: flush the range before zero range conversion · da5f1096
    Brian Foster authored
    XFS currently discards delalloc blocks within the target range of a
    zero range request. Unaligned start and end offsets are zeroed
    through the page cache and the internal, aligned blocks are
    converted to unwritten extents.
    
    If EOF is page aligned and covered by a delayed allocation extent.
    The inode size is not updated until I/O completion. If a zero range
    request discards a delalloc range that covers page aligned EOF as
    such, the inode size update never occurs. For example:
    
    $ rm -f /mnt/file
    $ xfs_io -fc "pwrite 0 64k" -c "zero 60k 4k" /mnt/file
    $ stat -c "%s" /mnt/file
    65536
    $ umount /mnt
    $ mount <dev> /mnt
    $ stat -c "%s" /mnt/file
    61440
    
    Update xfs_zero_file_space() to flush the range rather than discard
    delalloc blocks to ensure that inode size updates occur
    appropriately.
    
    [dchinner: Note that this is really a workaround to avoid the
    underlying problems. More work is needed (and ongoing) to fix those
    issues so this fix is being added as a temporary stop-gap measure. ]
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    da5f1096
xfs_bmap_util.c 50.6 KB