• Dave Chinner's avatar
    iomap: iomap that extends beyond EOF should be marked dirty · 7684e2c4
    Dave Chinner authored
    When doing a direct IO that spans the current EOF, and there are
    written blocks beyond EOF that extend beyond the current write, the
    only metadata update that needs to be done is a file size extension.
    
    However, we don't mark such iomaps as IOMAP_F_DIRTY to indicate that
    there is IO completion metadata updates required, and hence we may
    fail to correctly sync file size extensions made in IO completion
    when O_DSYNC writes are being used and the hardware supports FUA.
    
    Hence when setting IOMAP_F_DIRTY, we need to also take into account
    whether the iomap spans the current EOF. If it does, then we need to
    mark it dirty so that IO completion will call generic_write_sync()
    to flush the inode size update to stable storage correctly.
    
    Fixes: 3460cac1 ("iomap: Use FUA for pure data O_DSYNC DIO writes")
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    [darrick: removed the ext4 part; they'll handle it separately]
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    7684e2c4
xfs_iomap.c 34.8 KB