• J
    xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() · 17ec81c1
    Jie Liu 提交于
    At xfs_iext_realloc_direct(), the new_size is changed by adding
    if_bytes if originally the extent records are stored at the inline
    extent buffer, and we have to switch from it to a direct extent
    list for those new allocated extents, this is wrong. e.g,
    
    Create a file with three extents which was showing as following,
    
    xfs_io -f -c "truncate 100m" /xfs/testme
    
    for i in $(seq 0 5 10); do
    	offset=$(($i * $((1 << 20))))
    	xfs_io -c "pwrite $offset 1m" /xfs/testme
    done
    
    Inline
    ------
    irec:	if_bytes	bytes_diff	new_size
    1st	0		16		16
    2nd	16		16		32
    
    Switching
    ---------						rnew_size
    3rd	32		16		48 + 32 = 80	roundup=128
    
    In this case, the desired value of new_size should be 48, and then
    it will be roundup to 64 and be assigned to rnew_size.
    
    However, this issue has been covered by resetting the if_bytes to
    the new_size which is calculated at the begnning of xfs_iext_add()
    before leaving out this function, and in turn make the rnew_size
    correctly again. Hence, this can not be detected via xfstestes.
    
    This patch fix above problem and revise the new_size comments at
    xfs_iext_realloc_direct() to make it more readable.  Also, fix the
    comments while switching from the inline extent buffer to a direct
    extent list to reflect this change.
    Signed-off-by: NJie Liu <jeff.liu@oracle.com>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    Signed-off-by: NBen Myers <bpm@sgi.com>
    17ec81c1
xfs_inode_fork.c 55.4 KB