• Eric Sandeen's avatar
    fix readahead calculations in xfs_dir2_leaf_getdents() · 8e69ce14
    Eric Sandeen authored
    This is for bug #850,
    http://oss.sgi.com/bugzilla/show_bug.cgi?id=850
    XFS file system segfaults , repeatedly and 100% reproducable in 2.6.30 , 2.6.31
    
    The above only showed up on a CONFIG_XFS_DEBUG=y kernel, because
    xfs_bmapi() ASSERTs that it has been asked for at least one map,
    
    and it was getting 0.
    
    The root cause is that our guesstimated "bufsize" from xfs_file_readdir
    was fairly small, and the
    
    		bufsize -= length;
    
    in the loop was going negative - except bufsize is a size_t, so it
    was wrapping to a very large number.
    
    Then when we did
    		ra_want = howmany(bufsize + mp->m_dirblksize,
    				  mp->m_sb.sb_blocksize) - 1;
    
    with that very large number, the (int) ra_want was coming out
    negative, and a subsequent compare:
    
    		if (1 + ra_want > map_blocks ...
    
    was coming out -true- (negative int compare w/ uint) and we went
    back to xfs_bmapi() for more, even though we did not need more,
    and asked for 0 maps, and hit the ASSERT.
    
    We have kind of a type mess here, but just keeping bufsize from
    going negative is probably sufficient to avoid the problem.
    Signed-off-by: default avatarEric Sandeen <sandeen@sandeen.net>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarAlex Elder <aelder@sgi.com>
    Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
    8e69ce14
xfs_dir2_leaf.c 53 KB