| From ad747e3b299671e1a53db74963cc6c5f6cdb9f6d Mon Sep 17 00:00:00 2001 |
| From: Dave Chinner <dchinner@redhat.com> |
| Date: Wed, 6 Apr 2016 07:06:20 +1000 |
| Subject: xfs: Don't wrap growfs AGFL indexes |
| |
| From: Dave Chinner <dchinner@redhat.com> |
| |
| commit ad747e3b299671e1a53db74963cc6c5f6cdb9f6d upstream. |
| |
| Commit 96f859d ("libxfs: pack the agfl header structure so |
| XFS_AGFL_SIZE is correct") allowed the freelist to use the empty |
| slot at the end of the freelist on 64 bit systems that was not |
| being used due to sizeof() rounding up the structure size. |
| |
| This has caused versions of xfs_repair prior to 4.5.0 (which also |
| has the fix) to report this as a corruption once the filesystem has |
| been grown. Older kernels can also have problems (seen from a whacky |
| container/vm management environment) mounting filesystems grown on a |
| system with a newer kernel than the vm/container it is deployed on. |
| |
| To avoid this problem, change the initial free list indexes not to |
| wrap across the end of the AGFL, hence avoiding the initialisation |
| of agf_fllast to the last index in the AGFL. |
| |
| Signed-off-by: Dave Chinner <dchinner@redhat.com> |
| Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> |
| Signed-off-by: Dave Chinner <david@fromorbit.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/xfs/xfs_fsops.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/xfs/xfs_fsops.c |
| +++ b/fs/xfs/xfs_fsops.c |
| @@ -243,8 +243,8 @@ xfs_growfs_data_private( |
| agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); |
| agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); |
| agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); |
| - agf->agf_flfirst = 0; |
| - agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); |
| + agf->agf_flfirst = cpu_to_be32(1); |
| + agf->agf_fllast = 0; |
| agf->agf_flcount = 0; |
| tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); |
| agf->agf_freeblks = cpu_to_be32(tmpsize); |