• D
    xfs: fix directory readahead offset off-by-one · 8cfcc3e5
    Dave Chinner 提交于
    Directory readahead can throw loud scary but harmless warnings
    when multiblock directories are in use a specific pattern of
    discontiguous blocks are found in the directory. That is, if a hole
    follows a discontiguous block, it will throw a warning like:
    
    XFS (dm-1): xfs_da_do_buf: bno 637 dir: inode 34363923462
    XFS (dm-1): [00] br_startoff 637 br_startblock 1917954575 br_blockcount 1 br_state 0
    XFS (dm-1): [01] br_startoff 638 br_startblock -2 br_blockcount 1 br_state 0
    
    And dump a stack trace.
    
    This is because the readahead offset increment loop does a double
    increment of the block index - it does an increment for the loop
    iteration as well as increase the loop counter by the number of
    blocks in the extent. As a result, the readahead offset does not get
    incremented correctly for discontiguous blocks and hence can ask for
    readahead of a directory block from an offset part way through a
    directory block.  If that directory block is followed by a hole, it
    will trigger a mapping warning like the above.
    
    The bad readahead will be ignored, though, because the main
    directory block read loop uses the correct mapping offsets rather
    than the readahead offset and so will ignore the bad readahead
    altogether.
    
    Fix the warning by ensuring that the readahead offset is correctly
    incremented.
    Signed-off-by: NDave Chinner <dchinner@redhat.com>
    Reviewed-by: NChristoph Hellwig <hch@lst.de>
    Signed-off-by: NDave Chinner <david@fromorbit.com>
    8cfcc3e5
xfs_dir2_readdir.c 18.1 KB