• Dave Chinner's avatar
    xfs: recovery should not clear di_flushiter unconditionally · 7930d9e1
    Dave Chinner authored
    Because on v3 inodes, di_flushiter doesn't exist. It overlaps with
    zero padding in the inode, except when NREXT64=1 configurations are
    in use and the zero padding is no longer padding but holds the 64
    bit extent counter.
    
    This manifests obviously on big endian platforms (e.g. s390) because
    the log dinode is in host order and the overlap is the LSBs of the
    extent count field. It is not noticed on little endian machines
    because the overlap is at the MSB end of the extent count field and
    we need to get more than 2^^48 extents in the inode before it
    manifests. i.e. the heat death of the universe will occur before we
    see the problem in little endian machines.
    
    This is a zero-day issue for NREXT64=1 configuraitons on big endian
    machines. Fix it by only clearing di_flushiter on v2 inodes during
    recovery.
    
    Fixes: 9b7d16e3 ("xfs: Introduce XFS_DIFLAG2_NREXT64 and associated helpers")
    cc: stable@kernel.org # 5.19+
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: default avatarChandan Babu R <chandanbabu@kernel.org>
    7930d9e1
xfs_inode_item_recover.c 16.5 KB