• Eric Sandeen's avatar
    xfs: recalculate leaf entry pointer after compacting a dir2 block · d4608632
    Eric Sandeen authored
    Dave Jones hit this assert when doing a compile on recent git, with
    CONFIG_XFS_DEBUG enabled:
    
    XFS: Assertion failed: (char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)), file: fs/xfs/xfs_dir2_data.c, line: 828
    
    Upon further digging, the tag found by xfs_dir2_data_unused_tag_p(dup)
    contained "2" and not the proper offset, and I found that this value was
    changed after the memmoves under "Use a stale leaf for our new entry."
    in xfs_dir2_block_addname(), i.e.
    
                            memmove(&blp[mid + 1], &blp[mid],
                                    (highstale - mid) * sizeof(*blp));
    
    overwrote it.
    
    What has happened is that the previous call to xfs_dir2_block_compact()
    has rearranged things; it changes btp->count as well as the
    blp array.  So after we make that call, we must recalculate the
    proper pointer to the leaf entries by making another call to
    xfs_dir2_block_leaf_p().
    
    Dave provided a metadump image which led to a simple reproducer
    (create a particular filename in the affected directory) and this
    resolves the testcase as well as the bug on his live system.
    
    Thanks also to dchinner for looking at this one with me.
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Tested-by: default avatarDave Jones <davej@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
    Signed-off-by: default avatarBen Myers <bpm@sgi.com>
    d4608632
xfs_dir2_block.c 35.6 KB