• Dave Chinner's avatar
    xfs: ensure truncate forces zeroed blocks to disk · 50848949
    Dave Chinner authored
    commit 5885ebda upstream.
    
    A new fsync vs power fail test in xfstests indicated that XFS can
    have unreliable data consistency when doing extending truncates that
    require block zeroing. The blocks beyond EOF get zeroed in memory,
    but we never force those changes to disk before we run the
    transaction that extends the file size and exposes those blocks to
    userspace. This can result in the blocks not being correctly zeroed
    after a crash.
    
    Because in-memory behaviour is correct, tools like fsx don't pick up
    any coherency problems - it's not until the filesystem is shutdown
    or the system crashes after writing the truncate transaction to the
    journal but before the zeroed data in the page cache is flushed that
    the issue is exposed.
    
    Fix this by also flushing the dirty data in memory region between
    the old size and new size when we've found blocks that need zeroing
    in the truncate process.
    Reported-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    [bwh: Backported to 3.2: adjust filename, context]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    50848949
xfs_file.c 31.3 KB