• Home
  • Raw
  • Download

Lines Matching refs:sb

19 int ext4_resize_begin(struct super_block *sb)  in ext4_resize_begin()  argument
30 if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) { in ext4_resize_begin()
31 ext4_warning(sb, "There are errors in the filesystem, " in ext4_resize_begin()
36 if (test_and_set_bit_lock(EXT4_RESIZING, &EXT4_SB(sb)->s_resize_flags)) in ext4_resize_begin()
42 void ext4_resize_end(struct super_block *sb) in ext4_resize_end() argument
44 clear_bit_unlock(EXT4_RESIZING, &EXT4_SB(sb)->s_resize_flags); in ext4_resize_end()
48 static ext4_group_t ext4_meta_bg_first_group(struct super_block *sb, in ext4_meta_bg_first_group() argument
50 return (group >> EXT4_DESC_PER_BLOCK_BITS(sb)) << in ext4_meta_bg_first_group()
51 EXT4_DESC_PER_BLOCK_BITS(sb); in ext4_meta_bg_first_group()
54 static ext4_fsblk_t ext4_meta_bg_first_block_no(struct super_block *sb, in ext4_meta_bg_first_block_no() argument
56 group = ext4_meta_bg_first_group(sb, group); in ext4_meta_bg_first_block_no()
57 return ext4_group_first_block_no(sb, group); in ext4_meta_bg_first_block_no()
60 static ext4_grpblk_t ext4_group_overhead_blocks(struct super_block *sb, in ext4_group_overhead_blocks() argument
63 overhead = ext4_bg_num_gdb(sb, group); in ext4_group_overhead_blocks()
64 if (ext4_bg_has_super(sb, group)) in ext4_group_overhead_blocks()
66 le16_to_cpu(EXT4_SB(sb)->s_es->s_reserved_gdt_blocks); in ext4_group_overhead_blocks()
73 static int verify_group_input(struct super_block *sb, in verify_group_input() argument
76 struct ext4_sb_info *sbi = EXT4_SB(sb); in verify_group_input()
89 ext4_warning(sb, "Cannot add at group %u (only %u groups)", in verify_group_input()
94 overhead = ext4_group_overhead_blocks(sb, group); in verify_group_input()
99 if (test_opt(sb, DEBUG)) in verify_group_input()
102 ext4_bg_has_super(sb, input->group) ? "normal" : in verify_group_input()
106 ext4_get_group_no_and_offset(sb, start, NULL, &offset); in verify_group_input()
108 ext4_warning(sb, "Last group not full"); in verify_group_input()
110 ext4_warning(sb, "Reserved blocks too high (%u)", in verify_group_input()
113 ext4_warning(sb, "Bad blocks count %u", in verify_group_input()
115 else if (!(bh = sb_bread(sb, end - 1))) in verify_group_input()
116 ext4_warning(sb, "Cannot read last block (%llu)", in verify_group_input()
119 ext4_warning(sb, "Block bitmap not in group (block %llu)", in verify_group_input()
122 ext4_warning(sb, "Inode bitmap not in group (block %llu)", in verify_group_input()
126 ext4_warning(sb, "Inode table not in group (blocks %llu-%llu)", in verify_group_input()
129 ext4_warning(sb, "Block bitmap same as inode bitmap (%llu)", in verify_group_input()
132 ext4_warning(sb, "Block bitmap (%llu) in inode table " in verify_group_input()
137 ext4_warning(sb, "Inode bitmap (%llu) in inode table " in verify_group_input()
142 ext4_warning(sb, "Block bitmap (%llu) in GDT table (%llu-%llu)", in verify_group_input()
146 ext4_warning(sb, "Inode bitmap (%llu) in GDT table (%llu-%llu)", in verify_group_input()
151 ext4_warning(sb, "Inode table (%llu-%llu) overlaps GDT table " in verify_group_input()
232 static int ext4_alloc_group_tables(struct super_block *sb, in ext4_alloc_group_tables() argument
259 start_blk = ext4_group_first_block_no(sb, src_group); in ext4_alloc_group_tables()
262 overhead = ext4_group_overhead_blocks(sb, src_group); in ext4_alloc_group_tables()
269 overhead = ext4_group_overhead_blocks(sb, src_group); in ext4_alloc_group_tables()
281 group = ext4_get_group_number(sb, start_blk - 1); in ext4_alloc_group_tables()
292 group = ext4_get_group_number(sb, start_blk - 1); in ext4_alloc_group_tables()
300 unsigned int itb = EXT4_SB(sb)->s_itb_per_group; in ext4_alloc_group_tables()
306 group = ext4_get_group_number(sb, start_blk); in ext4_alloc_group_tables()
307 next_group_start = ext4_group_first_block_no(sb, group + 1); in ext4_alloc_group_tables()
319 start_blk += EXT4_SB(sb)->s_itb_per_group; in ext4_alloc_group_tables()
322 if (test_opt(sb, DEBUG)) { in ext4_alloc_group_tables()
333 ext4_bg_has_super(sb, group + i) ? "normal" : in ext4_alloc_group_tables()
342 static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, in bclean() argument
348 bh = sb_getblk(sb, blk); in bclean()
356 memset(bh->b_data, 0, sb->s_blocksize); in bclean()
396 static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle, in set_flexbg_block_bitmap() argument
409 group = ext4_get_group_number(sb, block); in set_flexbg_block_bitmap()
410 start = ext4_group_first_block_no(sb, group); in set_flexbg_block_bitmap()
413 count2 = EXT4_BLOCKS_PER_GROUP(sb) - (block - start); in set_flexbg_block_bitmap()
426 bh = sb_getblk(sb, flex_gd->groups[group].block_bitmap); in set_flexbg_block_bitmap()
461 static int setup_new_flex_group_blocks(struct super_block *sb, in setup_new_flex_group_blocks() argument
464 int group_table_count[] = {1, 1, EXT4_SB(sb)->s_itb_per_group}; in setup_new_flex_group_blocks()
467 struct ext4_sb_info *sbi = EXT4_SB(sb); in setup_new_flex_group_blocks()
481 meta_bg = EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG); in setup_new_flex_group_blocks()
484 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, EXT4_MAX_TRANS_DATA); in setup_new_flex_group_blocks()
493 gdblocks = ext4_bg_num_gdb(sb, group); in setup_new_flex_group_blocks()
494 start = ext4_group_first_block_no(sb, group); in setup_new_flex_group_blocks()
496 if (meta_bg == 0 && !ext4_bg_has_super(sb, group)) in setup_new_flex_group_blocks()
501 first_group = ext4_meta_bg_first_group(sb, group); in setup_new_flex_group_blocks()
503 first_group != group + EXT4_DESC_PER_BLOCK(sb) - 1) in setup_new_flex_group_blocks()
507 block = start + ext4_bg_has_super(sb, group); in setup_new_flex_group_blocks()
517 gdb = sb_getblk(sb, block); in setup_new_flex_group_blocks()
544 if (ext4_bg_has_super(sb, group)) { in setup_new_flex_group_blocks()
545 err = sb_issue_zeroout(sb, gdblocks + start + 1, in setup_new_flex_group_blocks()
560 err = sb_issue_zeroout(sb, block, sbi->s_itb_per_group, in setup_new_flex_group_blocks()
575 bh = bclean(handle, sb, block); in setup_new_flex_group_blocks()
581 overhead = ext4_group_overhead_blocks(sb, group); in setup_new_flex_group_blocks()
588 sb->s_blocksize * 8, bh->b_data); in setup_new_flex_group_blocks()
604 bh = bclean(handle, sb, block); in setup_new_flex_group_blocks()
611 ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), in setup_new_flex_group_blocks()
612 sb->s_blocksize * 8, bh->b_data); in setup_new_flex_group_blocks()
631 err = set_flexbg_block_bitmap(sb, handle, in setup_new_flex_group_blocks()
641 err = set_flexbg_block_bitmap(sb, handle, in setup_new_flex_group_blocks()
664 static unsigned ext4_list_backups(struct super_block *sb, unsigned *three, in ext4_list_backups() argument
671 if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_list_backups()
698 static int verify_reserved_gdb(struct super_block *sb, in verify_reserved_gdb() argument
710 while ((grp = ext4_list_backups(sb, &three, &five, &seven)) < end) { in verify_reserved_gdb()
712 grp * EXT4_BLOCKS_PER_GROUP(sb) + blk){ in verify_reserved_gdb()
713 ext4_warning(sb, "reserved GDT %llu" in verify_reserved_gdb()
717 (ext4_fsblk_t)EXT4_BLOCKS_PER_GROUP(sb) + in verify_reserved_gdb()
721 if (++gdbackups > EXT4_ADDR_PER_BLOCK(sb)) in verify_reserved_gdb()
744 struct super_block *sb = inode->i_sb; in add_new_gdb() local
745 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in add_new_gdb()
746 unsigned long gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in add_new_gdb()
747 ext4_fsblk_t gdblock = EXT4_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num; in add_new_gdb()
756 if (test_opt(sb, DEBUG)) in add_new_gdb()
766 if (EXT4_SB(sb)->s_sbh->b_blocknr != in add_new_gdb()
767 le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) { in add_new_gdb()
768 ext4_warning(sb, "won't resize using backup superblock at %llu", in add_new_gdb()
769 (unsigned long long)EXT4_SB(sb)->s_sbh->b_blocknr); in add_new_gdb()
773 gdb_bh = sb_bread(sb, gdblock); in add_new_gdb()
777 gdbackups = verify_reserved_gdb(sb, group, gdb_bh); in add_new_gdb()
784 dind = sb_bread(sb, le32_to_cpu(*data)); in add_new_gdb()
791 if (le32_to_cpu(data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)]) != gdblock) { in add_new_gdb()
792 ext4_warning(sb, "new group %u GDT block %llu not reserved", in add_new_gdb()
798 BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get_write_access"); in add_new_gdb()
799 err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh); in add_new_gdb()
811 ext4_std_error(sb, err); in add_new_gdb()
823 ext4_warning(sb, "not enough memory for %lu groups", in add_new_gdb()
837 data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)] = 0; in add_new_gdb()
840 ext4_std_error(sb, err); in add_new_gdb()
843 inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; in add_new_gdb()
845 memset(gdb_bh->b_data, 0, sb->s_blocksize); in add_new_gdb()
848 ext4_std_error(sb, err); in add_new_gdb()
853 o_group_desc = EXT4_SB(sb)->s_group_desc; in add_new_gdb()
855 EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); in add_new_gdb()
857 EXT4_SB(sb)->s_group_desc = n_group_desc; in add_new_gdb()
858 EXT4_SB(sb)->s_gdb_count++; in add_new_gdb()
862 err = ext4_handle_dirty_super(handle, sb); in add_new_gdb()
864 ext4_std_error(sb, err); in add_new_gdb()
883 static int add_new_gdb_meta_bg(struct super_block *sb, in add_new_gdb_meta_bg() argument
888 unsigned long gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in add_new_gdb_meta_bg()
891 gdblock = ext4_meta_bg_first_block_no(sb, group) + in add_new_gdb_meta_bg()
892 ext4_bg_has_super(sb, group); in add_new_gdb_meta_bg()
893 gdb_bh = sb_bread(sb, gdblock); in add_new_gdb_meta_bg()
901 ext4_warning(sb, "not enough memory for %lu groups", in add_new_gdb_meta_bg()
906 o_group_desc = EXT4_SB(sb)->s_group_desc; in add_new_gdb_meta_bg()
908 EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); in add_new_gdb_meta_bg()
910 EXT4_SB(sb)->s_group_desc = n_group_desc; in add_new_gdb_meta_bg()
911 EXT4_SB(sb)->s_gdb_count++; in add_new_gdb_meta_bg()
936 struct super_block *sb = inode->i_sb; in reserve_backup_gdb() local
937 int reserved_gdb =le16_to_cpu(EXT4_SB(sb)->s_es->s_reserved_gdt_blocks); in reserve_backup_gdb()
952 dind = sb_bread(sb, le32_to_cpu(*data)); in reserve_backup_gdb()
958 blk = EXT4_SB(sb)->s_sbh->b_blocknr + 1 + EXT4_SB(sb)->s_gdb_count; in reserve_backup_gdb()
959 data = (__le32 *)dind->b_data + (EXT4_SB(sb)->s_gdb_count % in reserve_backup_gdb()
960 EXT4_ADDR_PER_BLOCK(sb)); in reserve_backup_gdb()
961 end = (__le32 *)dind->b_data + EXT4_ADDR_PER_BLOCK(sb); in reserve_backup_gdb()
966 ext4_warning(sb, "reserved block %llu" in reserve_backup_gdb()
973 primary[res] = sb_bread(sb, blk); in reserve_backup_gdb()
978 gdbackups = verify_reserved_gdb(sb, group, primary[res]); in reserve_backup_gdb()
1001 blk = group * EXT4_BLOCKS_PER_GROUP(sb); in reserve_backup_gdb()
1013 inode->i_blocks += reserved_gdb * sb->s_blocksize >> 9; in reserve_backup_gdb()
1043 static void update_backups(struct super_block *sb, int blk_off, char *data, in update_backups() argument
1046 struct ext4_sb_info *sbi = EXT4_SB(sb); in update_backups()
1048 const int bpg = EXT4_BLOCKS_PER_GROUP(sb); in update_backups()
1053 int rest = sb->s_blocksize - size; in update_backups()
1057 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, EXT4_MAX_TRANS_DATA); in update_backups()
1065 group = ext4_list_backups(sb, &three, &five, &seven); in update_backups()
1068 group = ext4_meta_bg_first_group(sb, group) + 1; in update_backups()
1069 last = (ext4_group_t)(group + EXT4_DESC_PER_BLOCK(sb) - 2); in update_backups()
1086 backup_block = (ext4_group_first_block_no(sb, group) + in update_backups()
1087 ext4_bg_has_super(sb, group)); in update_backups()
1089 bh = sb_getblk(sb, backup_block); in update_backups()
1096 ext4_group_first_block_no(sb, group)); in update_backups()
1108 ext4_std_error(sb, err); in update_backups()
1112 group = ext4_list_backups(sb, &three, &five, &seven); in update_backups()
1133 ext4_warning(sb, "can't update backup for group %u (err %d), " in update_backups()
1151 static int ext4_add_new_descs(handle_t *handle, struct super_block *sb, in ext4_add_new_descs() argument
1155 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_add_new_descs()
1161 meta_bg = EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG); in ext4_add_new_descs()
1163 int reserved_gdb = ext4_bg_has_super(sb, group) ? in ext4_add_new_descs()
1166 gdb_off = group % EXT4_DESC_PER_BLOCK(sb); in ext4_add_new_descs()
1167 gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in ext4_add_new_descs()
1180 if (!err && reserved_gdb && ext4_bg_num_gdb(sb, group)) in ext4_add_new_descs()
1183 err = add_new_gdb_meta_bg(sb, handle, group); in ext4_add_new_descs()
1193 static struct buffer_head *ext4_get_bitmap(struct super_block *sb, __u64 block) in ext4_get_bitmap() argument
1195 struct buffer_head *bh = sb_getblk(sb, block); in ext4_get_bitmap()
1208 static int ext4_set_bitmap_checksums(struct super_block *sb, in ext4_set_bitmap_checksums() argument
1215 if (!ext4_has_metadata_csum(sb)) in ext4_set_bitmap_checksums()
1218 bh = ext4_get_bitmap(sb, group_data->inode_bitmap); in ext4_set_bitmap_checksums()
1221 ext4_inode_bitmap_csum_set(sb, group, gdp, bh, in ext4_set_bitmap_checksums()
1222 EXT4_INODES_PER_GROUP(sb) / 8); in ext4_set_bitmap_checksums()
1225 bh = ext4_get_bitmap(sb, group_data->block_bitmap); in ext4_set_bitmap_checksums()
1228 ext4_block_bitmap_csum_set(sb, group, gdp, bh); in ext4_set_bitmap_checksums()
1237 static int ext4_setup_new_descs(handle_t *handle, struct super_block *sb, in ext4_setup_new_descs() argument
1242 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_setup_new_descs()
1252 gdb_off = group % EXT4_DESC_PER_BLOCK(sb); in ext4_setup_new_descs()
1253 gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in ext4_setup_new_descs()
1261 gdb_off * EXT4_DESC_SIZE(sb)); in ext4_setup_new_descs()
1263 memset(gdp, 0, EXT4_DESC_SIZE(sb)); in ext4_setup_new_descs()
1264 ext4_block_bitmap_set(sb, gdp, group_data->block_bitmap); in ext4_setup_new_descs()
1265 ext4_inode_bitmap_set(sb, gdp, group_data->inode_bitmap); in ext4_setup_new_descs()
1266 err = ext4_set_bitmap_checksums(sb, group, gdp, group_data); in ext4_setup_new_descs()
1268 ext4_std_error(sb, err); in ext4_setup_new_descs()
1272 ext4_inode_table_set(sb, gdp, group_data->inode_table); in ext4_setup_new_descs()
1273 ext4_free_group_clusters_set(sb, gdp, in ext4_setup_new_descs()
1275 ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb)); in ext4_setup_new_descs()
1276 if (ext4_has_group_desc_csum(sb)) in ext4_setup_new_descs()
1277 ext4_itable_unused_set(sb, gdp, in ext4_setup_new_descs()
1278 EXT4_INODES_PER_GROUP(sb)); in ext4_setup_new_descs()
1280 ext4_group_desc_csum_set(sb, group, gdp); in ext4_setup_new_descs()
1284 ext4_std_error(sb, err); in ext4_setup_new_descs()
1292 err = ext4_mb_add_groupinfo(sb, group, gdp); in ext4_setup_new_descs()
1306 static void ext4_update_super(struct super_block *sb, in ext4_update_super() argument
1313 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_update_super()
1340 le32_add_cpu(&es->s_inodes_count, EXT4_INODES_PER_GROUP(sb) * in ext4_update_super()
1342 le32_add_cpu(&es->s_free_inodes_count, EXT4_INODES_PER_GROUP(sb) * in ext4_update_super()
1369 (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); in ext4_update_super()
1380 EXT4_INODES_PER_GROUP(sb) * flex_gd->count); in ext4_update_super()
1384 if (EXT4_HAS_INCOMPAT_FEATURE(sb, in ext4_update_super()
1391 atomic_add(EXT4_INODES_PER_GROUP(sb) * flex_gd->count, in ext4_update_super()
1398 ext4_calculate_overhead(sb); in ext4_update_super()
1400 if (test_opt(sb, DEBUG)) in ext4_update_super()
1410 static int ext4_flex_group_add(struct super_block *sb, in ext4_flex_group_add() argument
1414 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_flex_group_add()
1427 ext4_get_group_no_and_offset(sb, o_blocks_count, &group, &last); in ext4_flex_group_add()
1430 err = setup_new_flex_group_blocks(sb, flex_gd); in ext4_flex_group_add()
1441 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, credit); in ext4_flex_group_add()
1453 BUG_ON(group != EXT4_SB(sb)->s_groups_count); in ext4_flex_group_add()
1454 err = ext4_add_new_descs(handle, sb, group, in ext4_flex_group_add()
1459 err = ext4_setup_new_descs(handle, sb, flex_gd); in ext4_flex_group_add()
1463 ext4_update_super(sb, flex_gd); in ext4_flex_group_add()
1465 err = ext4_handle_dirty_super(handle, sb); in ext4_flex_group_add()
1473 int gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in ext4_flex_group_add()
1475 EXT4_DESC_PER_BLOCK(sb)); in ext4_flex_group_add()
1476 int meta_bg = EXT4_HAS_INCOMPAT_FEATURE(sb, in ext4_flex_group_add()
1480 update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, in ext4_flex_group_add()
1488 update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, in ext4_flex_group_add()
1497 static int ext4_setup_next_flex_gd(struct super_block *sb, in ext4_setup_next_flex_gd() argument
1502 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_setup_next_flex_gd()
1512 blocks_per_group = EXT4_BLOCKS_PER_GROUP(sb); in ext4_setup_next_flex_gd()
1519 ext4_get_group_no_and_offset(sb, o_blocks_count, &group, &last); in ext4_setup_next_flex_gd()
1521 ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &last); in ext4_setup_next_flex_gd()
1534 overhead = ext4_group_overhead_blocks(sb, group + i); in ext4_setup_next_flex_gd()
1536 if (ext4_has_group_desc_csum(sb)) { in ext4_setup_next_flex_gd()
1539 if (!test_opt(sb, INIT_INODE_TABLE)) in ext4_setup_next_flex_gd()
1545 if (last_group == n_group && ext4_has_group_desc_csum(sb)) in ext4_setup_next_flex_gd()
1571 int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) in ext4_group_add() argument
1574 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_group_add()
1576 int reserved_gdb = ext4_bg_has_super(sb, input->group) ? in ext4_group_add()
1583 gdb_off = input->group % EXT4_DESC_PER_BLOCK(sb); in ext4_group_add()
1585 if (gdb_off == 0 && !EXT4_HAS_RO_COMPAT_FEATURE(sb, in ext4_group_add()
1587 ext4_warning(sb, "Can't resize non-sparse filesystem further"); in ext4_group_add()
1593 ext4_warning(sb, "blocks_count overflow"); in ext4_group_add()
1597 if (le32_to_cpu(es->s_inodes_count) + EXT4_INODES_PER_GROUP(sb) < in ext4_group_add()
1599 ext4_warning(sb, "inodes_count overflow"); in ext4_group_add()
1604 if (!EXT4_HAS_COMPAT_FEATURE(sb, in ext4_group_add()
1607 ext4_warning(sb, in ext4_group_add()
1611 inode = ext4_iget(sb, EXT4_RESIZE_INO); in ext4_group_add()
1613 ext4_warning(sb, "Error opening resize inode"); in ext4_group_add()
1619 err = verify_group_input(sb, input); in ext4_group_add()
1623 err = ext4_alloc_flex_bg_array(sb, input->group + 1); in ext4_group_add()
1627 err = ext4_mb_alloc_groupinfo(sb, input->group + 1); in ext4_group_add()
1634 err = ext4_flex_group_add(sb, inode, &flex_gd); in ext4_group_add()
1643 static int ext4_group_extend_no_check(struct super_block *sb, in ext4_group_extend_no_check() argument
1646 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_group_extend_no_check()
1653 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, 3); in ext4_group_extend_no_check()
1656 ext4_warning(sb, "error %d on journal start", err); in ext4_group_extend_no_check()
1660 BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get_write_access"); in ext4_group_extend_no_check()
1661 err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh); in ext4_group_extend_no_check()
1663 ext4_warning(sb, "error %d on journal write access", err); in ext4_group_extend_no_check()
1672 err = ext4_group_add_blocks(handle, sb, o_blocks_count, add); in ext4_group_extend_no_check()
1675 ext4_handle_dirty_super(handle, sb); in ext4_group_extend_no_check()
1684 if (test_opt(sb, DEBUG)) in ext4_group_extend_no_check()
1687 update_backups(sb, EXT4_SB(sb)->s_sbh->b_blocknr, in ext4_group_extend_no_check()
1703 int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es, in ext4_group_extend() argument
1715 if (test_opt(sb, DEBUG)) in ext4_group_extend()
1716 ext4_msg(sb, KERN_DEBUG, in ext4_group_extend()
1723 if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { in ext4_group_extend()
1724 ext4_msg(sb, KERN_ERR, in ext4_group_extend()
1728 ext4_warning(sb, "CONFIG_LBDAF not enabled"); in ext4_group_extend()
1733 ext4_warning(sb, "can't shrink FS - resize aborted"); in ext4_group_extend()
1738 ext4_get_group_no_and_offset(sb, o_blocks_count, &group, &last); in ext4_group_extend()
1741 ext4_warning(sb, "need to use ext2online to resize further"); in ext4_group_extend()
1745 add = EXT4_BLOCKS_PER_GROUP(sb) - last; in ext4_group_extend()
1748 ext4_warning(sb, "blocks_count overflow"); in ext4_group_extend()
1756 ext4_warning(sb, "will only finish group (%llu blocks, %u new)", in ext4_group_extend()
1760 bh = sb_bread(sb, o_blocks_count + add - 1); in ext4_group_extend()
1762 ext4_warning(sb, "can't read last block, resize aborted"); in ext4_group_extend()
1767 err = ext4_group_extend_no_check(sb, o_blocks_count, add); in ext4_group_extend()
1772 static int num_desc_blocks(struct super_block *sb, ext4_group_t groups) in num_desc_blocks() argument
1774 return (groups + EXT4_DESC_PER_BLOCK(sb) - 1) / EXT4_DESC_PER_BLOCK(sb); in num_desc_blocks()
1782 static int ext4_convert_meta_bg(struct super_block *sb, struct inode *inode) in ext4_convert_meta_bg() argument
1785 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_convert_meta_bg()
1792 ext4_msg(sb, KERN_INFO, "Converting file system to meta_bg"); in ext4_convert_meta_bg()
1795 ext4_error(sb, "Unexpected non-zero " in ext4_convert_meta_bg()
1816 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, credits); in ext4_convert_meta_bg()
1825 EXT4_CLEAR_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_RESIZE_INODE); in ext4_convert_meta_bg()
1826 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG); in ext4_convert_meta_bg()
1828 cpu_to_le32(num_desc_blocks(sb, sbi->s_groups_count)); in ext4_convert_meta_bg()
1830 err = ext4_handle_dirty_super(handle, sb); in ext4_convert_meta_bg()
1832 ext4_std_error(sb, err); in ext4_convert_meta_bg()
1846 ext4_std_error(sb, err); in ext4_convert_meta_bg()
1856 ext4_error(sb, "corrupted/inconsistent resize inode"); in ext4_convert_meta_bg()
1866 int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) in ext4_resize_fs() argument
1869 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_resize_fs()
1885 bh = sb_bread(sb, n_blocks_count - 1); in ext4_resize_fs()
1887 ext4_warning(sb, "can't read last block, resize aborted"); in ext4_resize_fs()
1895 ext4_msg(sb, KERN_INFO, "resizing filesystem from %llu " in ext4_resize_fs()
1900 ext4_warning(sb, "can't shrink FS - resize aborted"); in ext4_resize_fs()
1908 n_group = ext4_get_group_number(sb, n_blocks_count - 1); in ext4_resize_fs()
1909 if (n_group > (0xFFFFFFFFUL / EXT4_INODES_PER_GROUP(sb))) { in ext4_resize_fs()
1910 ext4_warning(sb, "resize would cause inodes_count overflow"); in ext4_resize_fs()
1913 ext4_get_group_no_and_offset(sb, o_blocks_count - 1, &o_group, &offset); in ext4_resize_fs()
1915 n_desc_blocks = num_desc_blocks(sb, n_group + 1); in ext4_resize_fs()
1916 o_desc_blocks = num_desc_blocks(sb, sbi->s_groups_count); in ext4_resize_fs()
1918 meta_bg = EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG); in ext4_resize_fs()
1920 if (EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_RESIZE_INODE)) { in ext4_resize_fs()
1922 ext4_error(sb, "resize_inode and meta_bg enabled " in ext4_resize_fs()
1931 n_group = n_desc_blocks * EXT4_DESC_PER_BLOCK(sb); in ext4_resize_fs()
1932 n_blocks_count = n_group * EXT4_BLOCKS_PER_GROUP(sb); in ext4_resize_fs()
1937 resize_inode = ext4_iget(sb, EXT4_RESIZE_INO); in ext4_resize_fs()
1939 ext4_warning(sb, "Error opening resize inode"); in ext4_resize_fs()
1945 err = ext4_convert_meta_bg(sb, resize_inode); in ext4_resize_fs()
1963 add = EXT4_BLOCKS_PER_GROUP(sb) - (offset + 1); in ext4_resize_fs()
1965 err = ext4_group_extend_no_check(sb, o_blocks_count, add); in ext4_resize_fs()
1973 err = ext4_alloc_flex_bg_array(sb, n_group + 1); in ext4_resize_fs()
1977 err = ext4_mb_alloc_groupinfo(sb, n_group + 1); in ext4_resize_fs()
1990 while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count, in ext4_resize_fs()
1994 ext4_msg(sb, KERN_INFO, in ext4_resize_fs()
1999 if (ext4_alloc_group_tables(sb, flex_gd, flexbg_size) != 0) in ext4_resize_fs()
2001 err = ext4_flex_group_add(sb, resize_inode, flex_gd); in ext4_resize_fs()
2019 ext4_msg(sb, KERN_INFO, "resized filesystem to %llu", n_blocks_count); in ext4_resize_fs()