diff options
Diffstat (limited to 'fs/ext4/resize.c')
-rw-r--r-- | fs/ext4/resize.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index f9d948f0eb86..59fa0be27251 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -1163,8 +1163,11 @@ static void ext4_update_super(struct super_block *sb, | |||
1163 | do_div(reserved_blocks, 100); | 1163 | do_div(reserved_blocks, 100); |
1164 | 1164 | ||
1165 | ext4_blocks_count_set(es, ext4_blocks_count(es) + blocks_count); | 1165 | ext4_blocks_count_set(es, ext4_blocks_count(es) + blocks_count); |
1166 | ext4_free_blocks_count_set(es, ext4_free_blocks_count(es) + free_blocks); | ||
1166 | le32_add_cpu(&es->s_inodes_count, EXT4_INODES_PER_GROUP(sb) * | 1167 | le32_add_cpu(&es->s_inodes_count, EXT4_INODES_PER_GROUP(sb) * |
1167 | flex_gd->count); | 1168 | flex_gd->count); |
1169 | le32_add_cpu(&es->s_free_inodes_count, EXT4_INODES_PER_GROUP(sb) * | ||
1170 | flex_gd->count); | ||
1168 | 1171 | ||
1169 | /* | 1172 | /* |
1170 | * We need to protect s_groups_count against other CPUs seeing | 1173 | * We need to protect s_groups_count against other CPUs seeing |
@@ -1465,6 +1468,7 @@ static int ext4_group_extend_no_check(struct super_block *sb, | |||
1465 | } | 1468 | } |
1466 | 1469 | ||
1467 | ext4_blocks_count_set(es, o_blocks_count + add); | 1470 | ext4_blocks_count_set(es, o_blocks_count + add); |
1471 | ext4_free_blocks_count_set(es, ext4_free_blocks_count(es) + add); | ||
1468 | ext4_debug("freeing blocks %llu through %llu\n", o_blocks_count, | 1472 | ext4_debug("freeing blocks %llu through %llu\n", o_blocks_count, |
1469 | o_blocks_count + add); | 1473 | o_blocks_count + add); |
1470 | /* We add the blocks to the bitmap and set the group need init bit */ | 1474 | /* We add the blocks to the bitmap and set the group need init bit */ |
@@ -1512,16 +1516,17 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es, | |||
1512 | o_blocks_count = ext4_blocks_count(es); | 1516 | o_blocks_count = ext4_blocks_count(es); |
1513 | 1517 | ||
1514 | if (test_opt(sb, DEBUG)) | 1518 | if (test_opt(sb, DEBUG)) |
1515 | printk(KERN_DEBUG "EXT4-fs: extending last group from %llu to %llu blocks\n", | 1519 | ext4_msg(sb, KERN_DEBUG, |
1516 | o_blocks_count, n_blocks_count); | 1520 | "extending last group from %llu to %llu blocks", |
1521 | o_blocks_count, n_blocks_count); | ||
1517 | 1522 | ||
1518 | if (n_blocks_count == 0 || n_blocks_count == o_blocks_count) | 1523 | if (n_blocks_count == 0 || n_blocks_count == o_blocks_count) |
1519 | return 0; | 1524 | return 0; |
1520 | 1525 | ||
1521 | if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { | 1526 | if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { |
1522 | printk(KERN_ERR "EXT4-fs: filesystem on %s:" | 1527 | ext4_msg(sb, KERN_ERR, |
1523 | " too large to resize to %llu blocks safely\n", | 1528 | "filesystem too large to resize to %llu blocks safely", |
1524 | sb->s_id, n_blocks_count); | 1529 | n_blocks_count); |
1525 | if (sizeof(sector_t) < 8) | 1530 | if (sizeof(sector_t) < 8) |
1526 | ext4_warning(sb, "CONFIG_LBDAF not enabled"); | 1531 | ext4_warning(sb, "CONFIG_LBDAF not enabled"); |
1527 | return -EINVAL; | 1532 | return -EINVAL; |
@@ -1582,7 +1587,7 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) | |||
1582 | ext4_fsblk_t o_blocks_count; | 1587 | ext4_fsblk_t o_blocks_count; |
1583 | ext4_group_t o_group; | 1588 | ext4_group_t o_group; |
1584 | ext4_group_t n_group; | 1589 | ext4_group_t n_group; |
1585 | ext4_grpblk_t offset; | 1590 | ext4_grpblk_t offset, add; |
1586 | unsigned long n_desc_blocks; | 1591 | unsigned long n_desc_blocks; |
1587 | unsigned long o_desc_blocks; | 1592 | unsigned long o_desc_blocks; |
1588 | unsigned long desc_blocks; | 1593 | unsigned long desc_blocks; |
@@ -1591,8 +1596,8 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) | |||
1591 | o_blocks_count = ext4_blocks_count(es); | 1596 | o_blocks_count = ext4_blocks_count(es); |
1592 | 1597 | ||
1593 | if (test_opt(sb, DEBUG)) | 1598 | if (test_opt(sb, DEBUG)) |
1594 | printk(KERN_DEBUG "EXT4-fs: resizing filesystem from %llu " | 1599 | ext4_msg(sb, KERN_DEBUG, "resizing filesystem from %llu " |
1595 | "upto %llu blocks\n", o_blocks_count, n_blocks_count); | 1600 | "to %llu blocks", o_blocks_count, n_blocks_count); |
1596 | 1601 | ||
1597 | if (n_blocks_count < o_blocks_count) { | 1602 | if (n_blocks_count < o_blocks_count) { |
1598 | /* On-line shrinking not supported */ | 1603 | /* On-line shrinking not supported */ |
@@ -1605,7 +1610,7 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) | |||
1605 | return 0; | 1610 | return 0; |
1606 | 1611 | ||
1607 | ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &offset); | 1612 | ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &offset); |
1608 | ext4_get_group_no_and_offset(sb, o_blocks_count, &o_group, &offset); | 1613 | ext4_get_group_no_and_offset(sb, o_blocks_count - 1, &o_group, &offset); |
1609 | 1614 | ||
1610 | n_desc_blocks = (n_group + EXT4_DESC_PER_BLOCK(sb)) / | 1615 | n_desc_blocks = (n_group + EXT4_DESC_PER_BLOCK(sb)) / |
1611 | EXT4_DESC_PER_BLOCK(sb); | 1616 | EXT4_DESC_PER_BLOCK(sb); |
@@ -1634,10 +1639,12 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) | |||
1634 | } | 1639 | } |
1635 | brelse(bh); | 1640 | brelse(bh); |
1636 | 1641 | ||
1637 | if (offset != 0) { | 1642 | /* extend the last group */ |
1638 | /* extend the last group */ | 1643 | if (n_group == o_group) |
1639 | ext4_grpblk_t add; | 1644 | add = n_blocks_count - o_blocks_count; |
1640 | add = EXT4_BLOCKS_PER_GROUP(sb) - offset; | 1645 | else |
1646 | add = EXT4_BLOCKS_PER_GROUP(sb) - (offset + 1); | ||
1647 | if (add > 0) { | ||
1641 | err = ext4_group_extend_no_check(sb, o_blocks_count, add); | 1648 | err = ext4_group_extend_no_check(sb, o_blocks_count, add); |
1642 | if (err) | 1649 | if (err) |
1643 | goto out; | 1650 | goto out; |
@@ -1674,7 +1681,7 @@ out: | |||
1674 | 1681 | ||
1675 | iput(resize_inode); | 1682 | iput(resize_inode); |
1676 | if (test_opt(sb, DEBUG)) | 1683 | if (test_opt(sb, DEBUG)) |
1677 | printk(KERN_DEBUG "EXT4-fs: resized filesystem from %llu " | 1684 | ext4_msg(sb, KERN_DEBUG, "resized filesystem from %llu " |
1678 | "upto %llu blocks\n", o_blocks_count, n_blocks_count); | 1685 | "upto %llu blocks", o_blocks_count, n_blocks_count); |
1679 | return err; | 1686 | return err; |
1680 | } | 1687 | } |