diff options
author | Jose R. Santos <jrs@us.ibm.com> | 2007-10-16 18:38:25 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2007-10-17 18:50:01 -0400 |
commit | ce421581794f6593830b056969ad7536ab929b2f (patch) | |
tree | f1b225ae41dbd64f9e6e931ee5454842c6b272ba /fs/ext4 | |
parent | c1bddad9491b3941f7ae27eeee1e4f4822fb3169 (diff) |
ext4: FLEX_BG Kernel support v2.
This feature relaxes check restrictions on where each block groups meta
data is located within the storage media. This allows for the allocation
of bitmaps or inode tables outside the block group boundaries in cases
where bad blocks forces us to look for new blocks which the owning block
group can not satisfy. This will also allow for new meta-data allocation
schemes to improve performance and scalability.
Signed-off-by: Jose R. Santos <jrs@us.ibm.com>
Cc: <linux-ext4@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/super.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index dd4ff9c87358..54450fa1af39 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1358,13 +1358,17 @@ static int ext4_check_descriptors (struct super_block * sb) | |||
1358 | ext4_fsblk_t inode_table; | 1358 | ext4_fsblk_t inode_table; |
1359 | struct ext4_group_desc * gdp = NULL; | 1359 | struct ext4_group_desc * gdp = NULL; |
1360 | int desc_block = 0; | 1360 | int desc_block = 0; |
1361 | int flexbg_flag = 0; | ||
1361 | int i; | 1362 | int i; |
1362 | 1363 | ||
1364 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) | ||
1365 | flexbg_flag = 1; | ||
1366 | |||
1363 | ext4_debug ("Checking group descriptors"); | 1367 | ext4_debug ("Checking group descriptors"); |
1364 | 1368 | ||
1365 | for (i = 0; i < sbi->s_groups_count; i++) | 1369 | for (i = 0; i < sbi->s_groups_count; i++) |
1366 | { | 1370 | { |
1367 | if (i == sbi->s_groups_count - 1) | 1371 | if (i == sbi->s_groups_count - 1 || flexbg_flag) |
1368 | last_block = ext4_blocks_count(sbi->s_es) - 1; | 1372 | last_block = ext4_blocks_count(sbi->s_es) - 1; |
1369 | else | 1373 | else |
1370 | last_block = first_block + | 1374 | last_block = first_block + |
@@ -1409,7 +1413,8 @@ static int ext4_check_descriptors (struct super_block * sb) | |||
1409 | le16_to_cpu(gdp->bg_checksum)); | 1413 | le16_to_cpu(gdp->bg_checksum)); |
1410 | return 0; | 1414 | return 0; |
1411 | } | 1415 | } |
1412 | first_block += EXT4_BLOCKS_PER_GROUP(sb); | 1416 | if (!flexbg_flag) |
1417 | first_block += EXT4_BLOCKS_PER_GROUP(sb); | ||
1413 | gdp = (struct ext4_group_desc *) | 1418 | gdp = (struct ext4_group_desc *) |
1414 | ((__u8 *)gdp + EXT4_DESC_SIZE(sb)); | 1419 | ((__u8 *)gdp + EXT4_DESC_SIZE(sb)); |
1415 | } | 1420 | } |