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 | } |
