[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-ext4
Subject:    Re: [PATCH] [RFC] mke2fs: handle flex_bg collision with backup descriptors
From:       Andreas Dilger <adilger () dilger ! ca>
Date:       2014-01-25 6:01:41
Message-ID: F504F1BE-6288-4A70-9CAC-397FC8A3ACB0 () dilger ! ca
[Download RAW message or body]

Note that this patch isn't solving the whole problem - I was in a bit of a rush \
writing the commit comment and pushing it out. 

There still is an issue in that the inode bitmap and inode table staring offset do \
not take the backup superblock and group descriptors into account, and as a result \
(when creating with -G 131072 at least) it overlaps three backups of 2049 blocks, and \
then collides with the next set of flexbg metadata blocks at the end. 

It is still a major improvement over the old code - only the last 4099 groups overlap \
in a 16TB filesystem instead of the last 124k groups as without it. I put RFC on it \
in case there is some easy way to fix this that should go into the patch. Otherwise, \
it would be ok to land. 

The current patch would work as expected with sparse_super2 if it put the first \
backup in group #9, since the bitmaps would exactly fill the first 8 groups, and the \
inode table would fill the next 32 or so (depending on what inode ratio was used). 

Cheers, Andreas

> On Jan 24, 2014, at 18:44, Andreas Dilger <adilger@dilger.ca> wrote:
> 
> If the flex_bg allocator is laying out block or inode bitmaps or
> inode tables, and collides with previously allocated metadata (for
> example the backup superblock or group descriptors) don't reset
> the allocator to the beginning of the flex_bg, but rather skip the
> intervening blocks if there aren't too many of them.
> 
> Otherwise, if a large flex_bg factor is specified (e.g. 131072) the
> inode table will hit the backup descriptors in groups 1, 3, 5, 7, 9
> and start interleaving with the block and inode bitmaps.  That ends
> up producing poorly allocated bitmaps and inode tables that are
> interleaved and not contiguous as was intended for flex_bg.
> 
> Signed-off-by: Andreas Dilger <adilger@dilger.ca>
> ---
> lib/ext2fs/alloc_tables.c |   17 ++++++++++++-----
> 1 files changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/ext2fs/alloc_tables.c b/lib/ext2fs/alloc_tables.c
> index 9f3d4e0..6b4392a 100644
> --- a/lib/ext2fs/alloc_tables.c
> +++ b/lib/ext2fs/alloc_tables.c
> @@ -47,16 +47,17 @@ static blk64_t flexbg_offset(ext2_filsys fs, dgrp_t group, \
> blk64_t start_blk, flexbg = group / flexbg_size;
> size = rem_grp * elem_size;
> 
> -    if (size > (int) (fs->super->s_blocks_per_group / 8))
> -        size = (int) fs->super->s_blocks_per_group / 8;
> +    if (size > (int) (fs->super->s_blocks_per_group / 4))
> +        size = (int) fs->super->s_blocks_per_group / 4;
> 
> /*
> * Don't do a long search if the previous block
> * search is still valid.
> */
> -    if (start_blk && ext2fs_test_block_bitmap_range2(bmap, start_blk,
> -                             elem_size))
> -        return start_blk;
> +    if (start_blk && ext2fs_get_free_blocks2(fs, start_blk,
> +                         start_blk + size, elem_size,
> +                         bmap, &first_free) == 0)
> +        return first_free;
> 
> start_blk = ext2fs_group_first_block2(fs, flexbg_size * flexbg);
> last_grp = group | (flexbg_size - 1);
> @@ -126,6 +127,8 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t \
> group, 
> if (group % flexbg_size)
> prev_block = ext2fs_block_bitmap_loc(fs, group - 1) + 1;
> +        /* FIXME: Take backup group descriptor blocks into account
> +         * if the flexbg allocations will grow to overlap them... */
> start_blk = flexbg_offset(fs, group, prev_block, bmap,
> rem_grps, 1);
> last_blk = ext2fs_group_last_block2(fs, last_grp);
> @@ -157,6 +160,8 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t \
> group, else
> prev_block = ext2fs_block_bitmap_loc(fs, group) +
> flexbg_size;
> +        /* FIXME: Take backup group descriptor blocks into account
> +         * if the flexbg allocations will grow to overlap them... */
> start_blk = flexbg_offset(fs, group, prev_block, bmap,
> rem_grps, 1);
> last_blk = ext2fs_group_last_block2(fs, last_grp);
> @@ -194,6 +199,8 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t \
> group, prev_block = ext2fs_inode_bitmap_loc(fs, group) +
> flexbg_size;
> 
> +        /* FIXME: Take backup group descriptor blocks into account
> +         * if the flexbg allocations will grow to overlap them... */
> group_blk = flexbg_offset(fs, group, prev_block, bmap,
> rem_grps, fs->inode_blocks_per_group);
> last_blk = ext2fs_group_last_block2(fs, last_grp);
> -- 
> 1.7.3.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic