Re: [PATCH 5/3] xfs: limit specualtive delalloc to maxioffset

Ben Myers
2012-05-08T17:59:12Z

On Sun, Apr 29, 2012 at 10:43:19PM +1000, Dave Chinner wrote:
>
> From: Dave Chinner <dchinner@redhat.com>
>
> Speculative delayed allocation beyond EOF near the maximum supported
> file offset can result in creating delalloc extents beyond
> mp->m_maxioffset (8EB). These can never be trimmed during
> xfs_free_eof_blocks() because they are beyond mp->m_maxioffset, and
> that results in assert failures in xfs_fs_destroy_inode() due to
> delalloc blocks still being present. xfstests 071 exposes this
> problem.
>
> Limit speculative delalloc to mp->m_maxioffset to avoid this
> problem.
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/xfs_iomap.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
> index 303c03a..4a08ea3 100644
> --- a/fs/xfs/xfs_iomap.c
> +++ b/fs/xfs/xfs_iomap.c
> @@ -412,6 +412,15 @@ retry:
> return error;
> }
>
> + /*
> + * Make sure preallocation does not create extents beyond the range we
> + * actually support in this filesystem.
> + */
> + if (last_fsb > XFS_B_TO_FSB(mp, mp->m_maxioffset))
> + last_fsb = XFS_B_TO_FSB(mp, mp->m_maxioffset);
> +
> + ASSERT(last_fsb > offset_fsb);
> +

Yeah, looks good. xfs_iomap_prealloc_size isn't the only one who can push us
up above m_maxioffset, so this is the right place for the check.

Reviewed-by: Ben Myers <bpm@sgi.com>