diff options
| -rw-r--r-- | fs/ext3/balloc.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 6250fcdf14a1..46623f77666b 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c | |||
| @@ -1493,12 +1493,33 @@ static int ext3_group_sparse(int group) | |||
| 1493 | */ | 1493 | */ |
| 1494 | int ext3_bg_has_super(struct super_block *sb, int group) | 1494 | int ext3_bg_has_super(struct super_block *sb, int group) |
| 1495 | { | 1495 | { |
| 1496 | if (EXT3_HAS_RO_COMPAT_FEATURE(sb,EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER)&& | 1496 | if (EXT3_HAS_RO_COMPAT_FEATURE(sb, |
| 1497 | !ext3_group_sparse(group)) | 1497 | EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER) && |
| 1498 | !ext3_group_sparse(group)) | ||
| 1498 | return 0; | 1499 | return 0; |
| 1499 | return 1; | 1500 | return 1; |
| 1500 | } | 1501 | } |
| 1501 | 1502 | ||
| 1503 | static unsigned long ext3_bg_num_gdb_meta(struct super_block *sb, int group) | ||
| 1504 | { | ||
| 1505 | unsigned long metagroup = group / EXT3_DESC_PER_BLOCK(sb); | ||
| 1506 | unsigned long first = metagroup * EXT3_DESC_PER_BLOCK(sb); | ||
| 1507 | unsigned long last = first + EXT3_DESC_PER_BLOCK(sb) - 1; | ||
| 1508 | |||
| 1509 | if (group == first || group == first + 1 || group == last) | ||
| 1510 | return 1; | ||
| 1511 | return 0; | ||
| 1512 | } | ||
| 1513 | |||
| 1514 | static unsigned long ext3_bg_num_gdb_nometa(struct super_block *sb, int group) | ||
| 1515 | { | ||
| 1516 | if (EXT3_HAS_RO_COMPAT_FEATURE(sb, | ||
| 1517 | EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER) && | ||
| 1518 | !ext3_group_sparse(group)) | ||
| 1519 | return 0; | ||
| 1520 | return EXT3_SB(sb)->s_gdb_count; | ||
| 1521 | } | ||
| 1522 | |||
| 1502 | /** | 1523 | /** |
| 1503 | * ext3_bg_num_gdb - number of blocks used by the group table in group | 1524 | * ext3_bg_num_gdb - number of blocks used by the group table in group |
| 1504 | * @sb: superblock for filesystem | 1525 | * @sb: superblock for filesystem |
| @@ -1510,9 +1531,14 @@ int ext3_bg_has_super(struct super_block *sb, int group) | |||
| 1510 | */ | 1531 | */ |
| 1511 | unsigned long ext3_bg_num_gdb(struct super_block *sb, int group) | 1532 | unsigned long ext3_bg_num_gdb(struct super_block *sb, int group) |
| 1512 | { | 1533 | { |
| 1513 | if (EXT3_HAS_RO_COMPAT_FEATURE(sb,EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER)&& | 1534 | unsigned long first_meta_bg = |
| 1514 | !ext3_group_sparse(group)) | 1535 | le32_to_cpu(EXT3_SB(sb)->s_es->s_first_meta_bg); |
| 1515 | return 0; | 1536 | unsigned long metagroup = group / EXT3_DESC_PER_BLOCK(sb); |
| 1516 | return EXT3_SB(sb)->s_gdb_count; | 1537 | |
| 1517 | } | 1538 | if (!EXT3_HAS_INCOMPAT_FEATURE(sb,EXT3_FEATURE_INCOMPAT_META_BG) || |
| 1539 | metagroup < first_meta_bg) | ||
| 1540 | return ext3_bg_num_gdb_nometa(sb,group); | ||
| 1518 | 1541 | ||
| 1542 | return ext3_bg_num_gdb_meta(sb,group); | ||
| 1543 | |||
| 1544 | } | ||
