• Dave Chinner's avatar
    xfs: fix failed write truncation handling. · c726de44
    Dave Chinner authored
    Since the move to the new truncate sequence we call xfs_setattr to
    truncate down excessively instanciated blocks.  As shown by the testcase
    in kernel.org BZ #22452 that doesn't work too well.  Due to the confusion
    of the internal inode size, and the VFS inode i_size it zeroes data that
    it shouldn't.
    
    But full blown truncate seems like overkill here.  We only instanciate
    delayed allocations in the write path, and given that we never released
    the iolock we can't have converted them to real allocations yet either.
    
    The only nasty case is pre-existing preallocation which we need to skip.
    We already do this for page discard during writeback, so make the delayed
    allocation block punching a generic function and call it from the failed
    write path as well as xfs_aops_discard_page. The callers are
    responsible for ensuring that partial blocks are not truncated away,
    and that they hold the ilock.
    
    Based on a fix originally from Christoph Hellwig. This version used
    filesystem blocks as the range unit.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    c726de44
xfs_bmap.h 13.1 KB