• Darrick J. Wong's avatar
    xfs: widen inode delalloc block counter to 64-bits · 394aafdc
    Darrick J. Wong authored
    Widen the incore inode's i_delayed_blks counter to be a 64-bit integer.
    This is necessary to fix an integer overflow problem that can be
    reproduced easily now that we use the counter to track blocks that are
    assigned to the inode in memory but not on disk.  This includes actual
    delalloc reservations as well as real extents in the COW fork that
    are waiting to be remapped into the data fork.
    
    These 'delayed mapping' blocks can easily exceed 2^32 blocks if one
    creates a very large sparse file of size approximately 2^33 bytes with
    one byte written every 2^23 bytes, sets a very large COW extent size
    hint of 2^23 blocks, reflinks the first file into a second file, and
    then writes a single byte every 2^23 blocks in the original file.
    
    When this happens, we'll try to create approximately 1024 2^23 extent
    reservations in the COW fork, which will overflow the counter and cause
    problems.
    
    Note that on x64 we end up filling a 4-byte gap in the structure so this
    doesn't increase the incore size.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarAllison Collins <allison.henderson@oracle.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    394aafdc
xfs_qm.c 46.6 KB