Lines Matching full:sb

46 int ext4_resize_begin(struct super_block *sb)  in ext4_resize_begin()  argument
48 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_resize_begin()
59 !ext4_has_feature_resize_inode(sb)) { in ext4_resize_begin()
60 ext4_error(sb, "resize_inode disabled but reserved GDT blocks non-zero"); in ext4_resize_begin()
71 ext4_warning(sb, "won't resize using backup superblock at %llu", in ext4_resize_begin()
81 ext4_warning(sb, "There are errors in the filesystem, " in ext4_resize_begin()
86 if (ext4_has_feature_sparse_super2(sb)) { in ext4_resize_begin()
87 ext4_msg(sb, KERN_ERR, "Online resizing not supported with sparse_super2"); in ext4_resize_begin()
98 int ext4_resize_end(struct super_block *sb, bool update_backups) in ext4_resize_end() argument
100 clear_bit_unlock(EXT4_FLAGS_RESIZING, &EXT4_SB(sb)->s_ext4_flags); in ext4_resize_end()
103 return ext4_update_overhead(sb, true); in ext4_resize_end()
107 static ext4_grpblk_t ext4_group_overhead_blocks(struct super_block *sb, in ext4_group_overhead_blocks() argument
110 overhead = ext4_bg_num_gdb(sb, group); in ext4_group_overhead_blocks()
111 if (ext4_bg_has_super(sb, group)) in ext4_group_overhead_blocks()
113 le16_to_cpu(EXT4_SB(sb)->s_es->s_reserved_gdt_blocks); in ext4_group_overhead_blocks()
120 static int verify_group_input(struct super_block *sb, in verify_group_input() argument
123 struct ext4_sb_info *sbi = EXT4_SB(sb); in verify_group_input()
136 ext4_warning(sb, "Cannot add at group %u (only %u groups)", in verify_group_input()
141 overhead = ext4_group_overhead_blocks(sb, group); in verify_group_input()
147 if (test_opt(sb, DEBUG)) in verify_group_input()
150 ext4_bg_has_super(sb, input->group) ? "normal" : in verify_group_input()
154 ext4_get_group_no_and_offset(sb, start, NULL, &offset); in verify_group_input()
156 ext4_warning(sb, "Last group not full"); in verify_group_input()
158 ext4_warning(sb, "Reserved blocks too high (%u)", in verify_group_input()
161 ext4_warning(sb, "Bad blocks count %u", in verify_group_input()
163 else if (IS_ERR(bh = ext4_sb_bread(sb, end - 1, 0))) { in verify_group_input()
166 ext4_warning(sb, "Cannot read last block (%llu)", in verify_group_input()
169 ext4_warning(sb, "Block bitmap not in group (block %llu)", in verify_group_input()
172 ext4_warning(sb, "Inode bitmap not in group (block %llu)", in verify_group_input()
176 ext4_warning(sb, "Inode table not in group (blocks %llu-%llu)", in verify_group_input()
179 ext4_warning(sb, "Block bitmap same as inode bitmap (%llu)", in verify_group_input()
182 ext4_warning(sb, "Block bitmap (%llu) in inode table " in verify_group_input()
187 ext4_warning(sb, "Inode bitmap (%llu) in inode table " in verify_group_input()
192 ext4_warning(sb, "Block bitmap (%llu) in GDT table (%llu-%llu)", in verify_group_input()
196 ext4_warning(sb, "Inode bitmap (%llu) in GDT table (%llu-%llu)", in verify_group_input()
201 ext4_warning(sb, "Inode table (%llu-%llu) overlaps GDT table " in verify_group_input()
297 * @sb: super block of fs to which the groups belongs
302 static int ext4_alloc_group_tables(struct super_block *sb, in ext4_alloc_group_tables() argument
330 start_blk = ext4_group_first_block_no(sb, src_group); in ext4_alloc_group_tables()
333 overhead = ext4_group_overhead_blocks(sb, src_group); in ext4_alloc_group_tables()
340 overhead = ext4_group_overhead_blocks(sb, src_group); in ext4_alloc_group_tables()
352 group = ext4_get_group_number(sb, start_blk - 1); in ext4_alloc_group_tables()
363 group = ext4_get_group_number(sb, start_blk - 1); in ext4_alloc_group_tables()
371 unsigned int itb = EXT4_SB(sb)->s_itb_per_group; in ext4_alloc_group_tables()
377 group = ext4_get_group_number(sb, start_blk); in ext4_alloc_group_tables()
378 next_group_start = ext4_group_first_block_no(sb, group + 1); in ext4_alloc_group_tables()
390 start_blk += EXT4_SB(sb)->s_itb_per_group; in ext4_alloc_group_tables()
396 EXT4_NUM_B2C(EXT4_SB(sb), in ext4_alloc_group_tables()
400 if (test_opt(sb, DEBUG)) { in ext4_alloc_group_tables()
411 ext4_bg_has_super(sb, group + i) ? "normal" : in ext4_alloc_group_tables()
421 static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, in bclean() argument
427 bh = sb_getblk(sb, blk); in bclean()
431 err = ext4_journal_get_write_access(handle, sb, bh, EXT4_JTR_NONE); in bclean()
436 memset(bh->b_data, 0, sb->s_blocksize); in bclean()
454 * @sb: super block
458 static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle, in set_flexbg_block_bitmap() argument
462 struct ext4_sb_info *sbi = EXT4_SB(sb); in set_flexbg_block_bitmap()
474 group = ext4_get_group_number(sb, EXT4_C2B(sbi, first_cluster)); in set_flexbg_block_bitmap()
475 start = EXT4_B2C(sbi, ext4_group_first_block_no(sb, group)); in set_flexbg_block_bitmap()
478 count2 = EXT4_CLUSTERS_PER_GROUP(sb) - (first_cluster - start); in set_flexbg_block_bitmap()
491 bh = sb_getblk(sb, flex_gd->groups[group].block_bitmap); in set_flexbg_block_bitmap()
496 err = ext4_journal_get_write_access(handle, sb, bh, in set_flexbg_block_bitmap()
529 static int setup_new_flex_group_blocks(struct super_block *sb, in setup_new_flex_group_blocks() argument
532 int group_table_count[] = {1, 1, EXT4_SB(sb)->s_itb_per_group}; in setup_new_flex_group_blocks()
535 struct ext4_sb_info *sbi = EXT4_SB(sb); in setup_new_flex_group_blocks()
549 meta_bg = ext4_has_feature_meta_bg(sb); in setup_new_flex_group_blocks()
552 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, EXT4_MAX_TRANS_DATA); in setup_new_flex_group_blocks()
561 gdblocks = ext4_bg_num_gdb(sb, group); in setup_new_flex_group_blocks()
562 start = ext4_group_first_block_no(sb, group); in setup_new_flex_group_blocks()
564 if (meta_bg == 0 && !ext4_bg_has_super(sb, group)) in setup_new_flex_group_blocks()
570 block = start + ext4_bg_has_super(sb, group); in setup_new_flex_group_blocks()
580 gdb = sb_getblk(sb, block); in setup_new_flex_group_blocks()
587 err = ext4_journal_get_write_access(handle, sb, gdb, in setup_new_flex_group_blocks()
608 if (ext4_bg_has_super(sb, group)) { in setup_new_flex_group_blocks()
609 err = sb_issue_zeroout(sb, gdblocks + start + 1, in setup_new_flex_group_blocks()
624 err = sb_issue_zeroout(sb, block, sbi->s_itb_per_group, in setup_new_flex_group_blocks()
639 bh = bclean(handle, sb, block); in setup_new_flex_group_blocks()
644 overhead = ext4_group_overhead_blocks(sb, group); in setup_new_flex_group_blocks()
652 sb->s_blocksize * 8, bh->b_data); in setup_new_flex_group_blocks()
668 bh = bclean(handle, sb, block); in setup_new_flex_group_blocks()
674 ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), in setup_new_flex_group_blocks()
675 sb->s_blocksize * 8, bh->b_data); in setup_new_flex_group_blocks()
693 err = set_flexbg_block_bitmap(sb, handle, in setup_new_flex_group_blocks()
706 err = set_flexbg_block_bitmap(sb, handle, in setup_new_flex_group_blocks()
731 unsigned int ext4_list_backups(struct super_block *sb, unsigned int *three, in ext4_list_backups() argument
734 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_list_backups()
739 if (ext4_has_feature_sparse_super2(sb)) { in ext4_list_backups()
749 if (!ext4_has_feature_sparse_super(sb)) { in ext4_list_backups()
775 static int verify_reserved_gdb(struct super_block *sb, in verify_reserved_gdb() argument
787 while ((grp = ext4_list_backups(sb, &three, &five, &seven)) < end) { in verify_reserved_gdb()
789 grp * EXT4_BLOCKS_PER_GROUP(sb) + blk){ in verify_reserved_gdb()
790 ext4_warning(sb, "reserved GDT %llu" in verify_reserved_gdb()
794 (ext4_fsblk_t)EXT4_BLOCKS_PER_GROUP(sb) + in verify_reserved_gdb()
798 if (++gdbackups > EXT4_ADDR_PER_BLOCK(sb)) in verify_reserved_gdb()
821 struct super_block *sb = inode->i_sb; in add_new_gdb() local
822 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in add_new_gdb()
823 unsigned long gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in add_new_gdb()
824 ext4_fsblk_t gdblock = EXT4_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num; in add_new_gdb()
833 if (test_opt(sb, DEBUG)) in add_new_gdb()
838 gdb_bh = ext4_sb_bread(sb, gdblock, 0); in add_new_gdb()
842 gdbackups = verify_reserved_gdb(sb, group, gdb_bh); in add_new_gdb()
849 dind = ext4_sb_bread(sb, le32_to_cpu(*data), 0); in add_new_gdb()
857 if (le32_to_cpu(data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)]) != gdblock) { in add_new_gdb()
858 ext4_warning(sb, "new group %u GDT block %llu not reserved", in add_new_gdb()
864 BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get_write_access"); in add_new_gdb()
865 err = ext4_journal_get_write_access(handle, sb, EXT4_SB(sb)->s_sbh, in add_new_gdb()
871 err = ext4_journal_get_write_access(handle, sb, gdb_bh, EXT4_JTR_NONE); in add_new_gdb()
876 err = ext4_journal_get_write_access(handle, sb, dind, EXT4_JTR_NONE); in add_new_gdb()
878 ext4_std_error(sb, err); in add_new_gdb()
891 ext4_warning(sb, "not enough memory for %lu groups", in add_new_gdb()
905 data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)] = 0; in add_new_gdb()
908 ext4_std_error(sb, err); in add_new_gdb()
911 inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> in add_new_gdb()
912 (9 - EXT4_SB(sb)->s_cluster_bits); in add_new_gdb()
914 memset(gdb_bh->b_data, 0, sb->s_blocksize); in add_new_gdb()
917 ext4_std_error(sb, err); in add_new_gdb()
924 o_group_desc = rcu_dereference(EXT4_SB(sb)->s_group_desc); in add_new_gdb()
926 EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); in add_new_gdb()
929 rcu_assign_pointer(EXT4_SB(sb)->s_group_desc, n_group_desc); in add_new_gdb()
930 EXT4_SB(sb)->s_gdb_count++; in add_new_gdb()
933 lock_buffer(EXT4_SB(sb)->s_sbh); in add_new_gdb()
935 ext4_superblock_csum_set(sb); in add_new_gdb()
936 unlock_buffer(EXT4_SB(sb)->s_sbh); in add_new_gdb()
937 err = ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh); in add_new_gdb()
939 ext4_std_error(sb, err); in add_new_gdb()
956 * must be a multiple of EXT4_DESC_PER_BLOCK(sb).
960 static int add_new_gdb_meta_bg(struct super_block *sb, in add_new_gdb_meta_bg() argument
965 unsigned long gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in add_new_gdb_meta_bg()
968 gdblock = ext4_group_first_block_no(sb, group) + in add_new_gdb_meta_bg()
969 ext4_bg_has_super(sb, group); in add_new_gdb_meta_bg()
970 gdb_bh = ext4_sb_bread(sb, gdblock, 0); in add_new_gdb_meta_bg()
978 ext4_warning(sb, "not enough memory for %lu groups", in add_new_gdb_meta_bg()
984 o_group_desc = rcu_dereference(EXT4_SB(sb)->s_group_desc); in add_new_gdb_meta_bg()
986 EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); in add_new_gdb_meta_bg()
991 err = ext4_journal_get_write_access(handle, sb, gdb_bh, EXT4_JTR_NONE); in add_new_gdb_meta_bg()
998 rcu_assign_pointer(EXT4_SB(sb)->s_group_desc, n_group_desc); in add_new_gdb_meta_bg()
999 EXT4_SB(sb)->s_gdb_count++; in add_new_gdb_meta_bg()
1020 struct super_block *sb = inode->i_sb; in reserve_backup_gdb() local
1021 int reserved_gdb =le16_to_cpu(EXT4_SB(sb)->s_es->s_reserved_gdt_blocks); in reserve_backup_gdb()
1022 int cluster_bits = EXT4_SB(sb)->s_cluster_bits; in reserve_backup_gdb()
1037 dind = ext4_sb_bread(sb, le32_to_cpu(*data), 0); in reserve_backup_gdb()
1044 blk = EXT4_SB(sb)->s_sbh->b_blocknr + 1 + EXT4_SB(sb)->s_gdb_count; in reserve_backup_gdb()
1045 data = (__le32 *)dind->b_data + (EXT4_SB(sb)->s_gdb_count % in reserve_backup_gdb()
1046 EXT4_ADDR_PER_BLOCK(sb)); in reserve_backup_gdb()
1047 end = (__le32 *)dind->b_data + EXT4_ADDR_PER_BLOCK(sb); in reserve_backup_gdb()
1052 ext4_warning(sb, "reserved block %llu" in reserve_backup_gdb()
1059 primary[res] = ext4_sb_bread(sb, blk, 0); in reserve_backup_gdb()
1065 gdbackups = verify_reserved_gdb(sb, group, primary[res]); in reserve_backup_gdb()
1077 if ((err = ext4_journal_get_write_access(handle, sb, primary[i], in reserve_backup_gdb()
1089 blk = group * EXT4_BLOCKS_PER_GROUP(sb); in reserve_backup_gdb()
1099 inode->i_blocks += reserved_gdb * sb->s_blocksize >> (9 - cluster_bits); in reserve_backup_gdb()
1113 static inline void ext4_set_block_group_nr(struct super_block *sb, char *data, in ext4_set_block_group_nr() argument
1119 if (ext4_has_metadata_csum(sb)) in ext4_set_block_group_nr()
1120 es->s_checksum = ext4_superblock_csum(sb, es); in ext4_set_block_group_nr()
1139 static void update_backups(struct super_block *sb, sector_t blk_off, char *data, in update_backups() argument
1142 struct ext4_sb_info *sbi = EXT4_SB(sb); in update_backups()
1144 const int bpg = EXT4_BLOCKS_PER_GROUP(sb); in update_backups()
1149 int rest = sb->s_blocksize - size; in update_backups()
1153 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, EXT4_MAX_TRANS_DATA); in update_backups()
1161 group = ext4_list_backups(sb, &three, &five, &seven); in update_backups()
1164 group = ext4_get_group_number(sb, blk_off) + 1; in update_backups()
1165 last = (ext4_group_t)(group + EXT4_DESC_PER_BLOCK(sb) - 2); in update_backups()
1171 int has_super = ext4_bg_has_super(sb, group); in update_backups()
1172 ext4_fsblk_t first_block = ext4_group_first_block_no(sb, group); in update_backups()
1184 bh = sb_getblk(sb, backup_block); in update_backups()
1191 ext4_group_first_block_no(sb, group)); in update_backups()
1193 if ((err = ext4_journal_get_write_access(handle, sb, bh, in update_backups()
1203 ext4_set_block_group_nr(sb, bh->b_data, group); in update_backups()
1208 ext4_std_error(sb, err); in update_backups()
1212 group = ext4_list_backups(sb, &three, &five, &seven); in update_backups()
1233 ext4_warning(sb, "can't update backup for group %u (err %d), " in update_backups()
1246 * @sb: super block
1251 static int ext4_add_new_descs(handle_t *handle, struct super_block *sb, in ext4_add_new_descs() argument
1255 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_add_new_descs()
1261 meta_bg = ext4_has_feature_meta_bg(sb); in ext4_add_new_descs()
1263 int reserved_gdb = ext4_bg_has_super(sb, group) ? in ext4_add_new_descs()
1266 gdb_off = group % EXT4_DESC_PER_BLOCK(sb); in ext4_add_new_descs()
1267 gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in ext4_add_new_descs()
1279 err = ext4_journal_get_write_access(handle, sb, gdb_bh, in ext4_add_new_descs()
1282 if (!err && reserved_gdb && ext4_bg_num_gdb(sb, group)) in ext4_add_new_descs()
1285 err = add_new_gdb_meta_bg(sb, handle, group); in ext4_add_new_descs()
1295 static struct buffer_head *ext4_get_bitmap(struct super_block *sb, __u64 block) in ext4_get_bitmap() argument
1297 struct buffer_head *bh = sb_getblk(sb, block); in ext4_get_bitmap()
1310 static int ext4_set_bitmap_checksums(struct super_block *sb, in ext4_set_bitmap_checksums() argument
1316 if (!ext4_has_metadata_csum(sb)) in ext4_set_bitmap_checksums()
1319 bh = ext4_get_bitmap(sb, group_data->inode_bitmap); in ext4_set_bitmap_checksums()
1322 ext4_inode_bitmap_csum_set(sb, gdp, bh, in ext4_set_bitmap_checksums()
1323 EXT4_INODES_PER_GROUP(sb) / 8); in ext4_set_bitmap_checksums()
1326 bh = ext4_get_bitmap(sb, group_data->block_bitmap); in ext4_set_bitmap_checksums()
1329 ext4_block_bitmap_csum_set(sb, gdp, bh); in ext4_set_bitmap_checksums()
1338 static int ext4_setup_new_descs(handle_t *handle, struct super_block *sb, in ext4_setup_new_descs() argument
1343 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_setup_new_descs()
1353 gdb_off = group % EXT4_DESC_PER_BLOCK(sb); in ext4_setup_new_descs()
1354 gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in ext4_setup_new_descs()
1362 gdb_off * EXT4_DESC_SIZE(sb)); in ext4_setup_new_descs()
1364 memset(gdp, 0, EXT4_DESC_SIZE(sb)); in ext4_setup_new_descs()
1365 ext4_block_bitmap_set(sb, gdp, group_data->block_bitmap); in ext4_setup_new_descs()
1366 ext4_inode_bitmap_set(sb, gdp, group_data->inode_bitmap); in ext4_setup_new_descs()
1367 err = ext4_set_bitmap_checksums(sb, gdp, group_data); in ext4_setup_new_descs()
1369 ext4_std_error(sb, err); in ext4_setup_new_descs()
1373 ext4_inode_table_set(sb, gdp, group_data->inode_table); in ext4_setup_new_descs()
1374 ext4_free_group_clusters_set(sb, gdp, in ext4_setup_new_descs()
1376 ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb)); in ext4_setup_new_descs()
1377 if (ext4_has_group_desc_csum(sb)) in ext4_setup_new_descs()
1378 ext4_itable_unused_set(sb, gdp, in ext4_setup_new_descs()
1379 EXT4_INODES_PER_GROUP(sb)); in ext4_setup_new_descs()
1381 ext4_group_desc_csum_set(sb, group, gdp); in ext4_setup_new_descs()
1385 ext4_std_error(sb, err); in ext4_setup_new_descs()
1393 err = ext4_mb_add_groupinfo(sb, group, gdp); in ext4_setup_new_descs()
1400 static void ext4_add_overhead(struct super_block *sb, in ext4_add_overhead() argument
1403 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_add_overhead()
1415 * @sb: super block
1418 static void ext4_update_super(struct super_block *sb, in ext4_update_super() argument
1425 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_update_super()
1453 le32_add_cpu(&es->s_inodes_count, EXT4_INODES_PER_GROUP(sb) * in ext4_update_super()
1455 le32_add_cpu(&es->s_free_inodes_count, EXT4_INODES_PER_GROUP(sb) * in ext4_update_super()
1482 (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); in ext4_update_super()
1493 EXT4_INODES_PER_GROUP(sb) * flex_gd->count); in ext4_update_super()
1497 if (ext4_has_feature_flex_bg(sb) && sbi->s_log_groups_per_flex) { in ext4_update_super()
1505 atomic_add(EXT4_INODES_PER_GROUP(sb) * flex_gd->count, in ext4_update_super()
1516 if (ext4_has_feature_bigalloc(sb) && (sbi->s_overhead != 0)) in ext4_update_super()
1517 ext4_add_overhead(sb, in ext4_update_super()
1520 ext4_calculate_overhead(sb); in ext4_update_super()
1523 ext4_superblock_csum_set(sb); in ext4_update_super()
1525 if (test_opt(sb, DEBUG)) in ext4_update_super()
1535 static int ext4_flex_group_add(struct super_block *sb, in ext4_flex_group_add() argument
1539 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_flex_group_add()
1552 ext4_get_group_no_and_offset(sb, o_blocks_count, &group, &last); in ext4_flex_group_add()
1555 err = setup_new_flex_group_blocks(sb, flex_gd); in ext4_flex_group_add()
1565 credit = 3; /* sb, resize inode, resize inode dindirect */ in ext4_flex_group_add()
1567 credit += 1 + DIV_ROUND_UP(flex_gd->count, EXT4_DESC_PER_BLOCK(sb)); in ext4_flex_group_add()
1569 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, credit); in ext4_flex_group_add()
1576 err = ext4_journal_get_write_access(handle, sb, sbi->s_sbh, in ext4_flex_group_add()
1583 err = ext4_add_new_descs(handle, sb, group, in ext4_flex_group_add()
1588 err = ext4_setup_new_descs(handle, sb, flex_gd); in ext4_flex_group_add()
1592 ext4_update_super(sb, flex_gd); in ext4_flex_group_add()
1602 int gdb_num = group / EXT4_DESC_PER_BLOCK(sb); in ext4_flex_group_add()
1604 EXT4_DESC_PER_BLOCK(sb)); in ext4_flex_group_add()
1605 int meta_bg = ext4_has_feature_meta_bg(sb); in ext4_flex_group_add()
1607 ext4_group_first_block_no(sb, 0); in ext4_flex_group_add()
1609 update_backups(sb, ext4_group_first_block_no(sb, 0), in ext4_flex_group_add()
1616 update_backups(sb, gdb_bh->b_blocknr - padding_blocks, in ext4_flex_group_add()
1624 static int ext4_setup_next_flex_gd(struct super_block *sb, in ext4_setup_next_flex_gd() argument
1628 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_setup_next_flex_gd()
1639 clusters_per_group = EXT4_CLUSTERS_PER_GROUP(sb); in ext4_setup_next_flex_gd()
1646 ext4_get_group_no_and_offset(sb, o_blocks_count, &group, &last); in ext4_setup_next_flex_gd()
1648 ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &last); in ext4_setup_next_flex_gd()
1660 group_data[i].blocks_count = EXT4_BLOCKS_PER_GROUP(sb); in ext4_setup_next_flex_gd()
1661 overhead = ext4_group_overhead_blocks(sb, group + i); in ext4_setup_next_flex_gd()
1663 group_data[i].free_clusters_count = EXT4_CLUSTERS_PER_GROUP(sb); in ext4_setup_next_flex_gd()
1664 if (ext4_has_group_desc_csum(sb)) { in ext4_setup_next_flex_gd()
1667 if (!test_opt(sb, INIT_INODE_TABLE)) in ext4_setup_next_flex_gd()
1673 if (last_group == n_group && ext4_has_group_desc_csum(sb)) in ext4_setup_next_flex_gd()
1699 int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) in ext4_group_add() argument
1702 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_group_add()
1704 int reserved_gdb = ext4_bg_has_super(sb, input->group) ? in ext4_group_add()
1711 gdb_off = input->group % EXT4_DESC_PER_BLOCK(sb); in ext4_group_add()
1713 if (gdb_off == 0 && !ext4_has_feature_sparse_super(sb)) { in ext4_group_add()
1714 ext4_warning(sb, "Can't resize non-sparse filesystem further"); in ext4_group_add()
1720 ext4_warning(sb, "blocks_count overflow"); in ext4_group_add()
1724 if (le32_to_cpu(es->s_inodes_count) + EXT4_INODES_PER_GROUP(sb) < in ext4_group_add()
1726 ext4_warning(sb, "inodes_count overflow"); in ext4_group_add()
1731 if (!ext4_has_feature_resize_inode(sb) || in ext4_group_add()
1733 ext4_warning(sb, in ext4_group_add()
1737 inode = ext4_iget(sb, EXT4_RESIZE_INO, EXT4_IGET_SPECIAL); in ext4_group_add()
1739 ext4_warning(sb, "Error opening resize inode"); in ext4_group_add()
1745 err = verify_group_input(sb, input); in ext4_group_add()
1749 err = ext4_alloc_flex_bg_array(sb, input->group + 1); in ext4_group_add()
1753 err = ext4_mb_alloc_groupinfo(sb, input->group + 1); in ext4_group_add()
1760 err = ext4_flex_group_add(sb, inode, &flex_gd); in ext4_group_add()
1769 static int ext4_group_extend_no_check(struct super_block *sb, in ext4_group_extend_no_check() argument
1772 struct ext4_super_block *es = EXT4_SB(sb)->s_es; in ext4_group_extend_no_check()
1779 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, 3); in ext4_group_extend_no_check()
1782 ext4_warning(sb, "error %d on journal start", err); in ext4_group_extend_no_check()
1786 BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get_write_access"); in ext4_group_extend_no_check()
1787 err = ext4_journal_get_write_access(handle, sb, EXT4_SB(sb)->s_sbh, in ext4_group_extend_no_check()
1790 ext4_warning(sb, "error %d on journal write access", err); in ext4_group_extend_no_check()
1794 lock_buffer(EXT4_SB(sb)->s_sbh); in ext4_group_extend_no_check()
1797 ext4_superblock_csum_set(sb); in ext4_group_extend_no_check()
1798 unlock_buffer(EXT4_SB(sb)->s_sbh); in ext4_group_extend_no_check()
1802 err = ext4_group_add_blocks(handle, sb, o_blocks_count, add); in ext4_group_extend_no_check()
1805 ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh); in ext4_group_extend_no_check()
1814 if (test_opt(sb, DEBUG)) in ext4_group_extend_no_check()
1817 update_backups(sb, ext4_group_first_block_no(sb, 0), in ext4_group_extend_no_check()
1833 int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es, in ext4_group_extend() argument
1844 if (test_opt(sb, DEBUG)) in ext4_group_extend()
1845 ext4_msg(sb, KERN_DEBUG, in ext4_group_extend()
1852 if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { in ext4_group_extend()
1853 ext4_msg(sb, KERN_ERR, in ext4_group_extend()
1860 ext4_warning(sb, "can't shrink FS - resize aborted"); in ext4_group_extend()
1865 ext4_get_group_no_and_offset(sb, o_blocks_count, &group, &last); in ext4_group_extend()
1868 ext4_warning(sb, "need to use ext2online to resize further"); in ext4_group_extend()
1872 add = EXT4_BLOCKS_PER_GROUP(sb) - last; in ext4_group_extend()
1875 ext4_warning(sb, "blocks_count overflow"); in ext4_group_extend()
1883 ext4_warning(sb, "will only finish group (%llu blocks, %u new)", in ext4_group_extend()
1887 bh = ext4_sb_bread(sb, o_blocks_count + add - 1, 0); in ext4_group_extend()
1889 ext4_warning(sb, "can't read last block, resize aborted"); in ext4_group_extend()
1894 return ext4_group_extend_no_check(sb, o_blocks_count, add); in ext4_group_extend()
1898 static int num_desc_blocks(struct super_block *sb, ext4_group_t groups) in num_desc_blocks() argument
1900 return (groups + EXT4_DESC_PER_BLOCK(sb) - 1) / EXT4_DESC_PER_BLOCK(sb); in num_desc_blocks()
1908 static int ext4_convert_meta_bg(struct super_block *sb, struct inode *inode) in ext4_convert_meta_bg() argument
1911 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_convert_meta_bg()
1918 ext4_msg(sb, KERN_INFO, "Converting file system to meta_bg"); in ext4_convert_meta_bg()
1921 ext4_error(sb, "Unexpected non-zero " in ext4_convert_meta_bg()
1943 handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, credits); in ext4_convert_meta_bg()
1948 err = ext4_journal_get_write_access(handle, sb, sbi->s_sbh, in ext4_convert_meta_bg()
1954 ext4_clear_feature_resize_inode(sb); in ext4_convert_meta_bg()
1955 ext4_set_feature_meta_bg(sb); in ext4_convert_meta_bg()
1957 cpu_to_le32(num_desc_blocks(sb, sbi->s_groups_count)); in ext4_convert_meta_bg()
1958 ext4_superblock_csum_set(sb); in ext4_convert_meta_bg()
1963 ext4_std_error(sb, err); in ext4_convert_meta_bg()
1977 ext4_std_error(sb, err); in ext4_convert_meta_bg()
1985 ext4_error(sb, "corrupted/inconsistent resize inode"); in ext4_convert_meta_bg()
1992 * @sb: super block of the fs to be resized
1995 int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) in ext4_resize_fs() argument
1998 struct ext4_sb_info *sbi = EXT4_SB(sb); in ext4_resize_fs()
2015 bh = ext4_sb_bread(sb, n_blocks_count - 1, 0); in ext4_resize_fs()
2017 ext4_warning(sb, "can't read last block, resize aborted"); in ext4_resize_fs()
2029 if (ext4_has_feature_bigalloc(sb)) in ext4_resize_fs()
2030 n_blocks_count &= ~((1 << EXT4_CLUSTER_BITS(sb)) - 1); in ext4_resize_fs()
2035 ext4_msg(sb, KERN_INFO, "resizing filesystem from %llu " in ext4_resize_fs()
2040 ext4_warning(sb, "can't shrink FS - resize aborted"); in ext4_resize_fs()
2048 n_group = ext4_get_group_number(sb, n_blocks_count - 1); in ext4_resize_fs()
2049 if (n_group >= (0xFFFFFFFFUL / EXT4_INODES_PER_GROUP(sb))) { in ext4_resize_fs()
2050 ext4_warning(sb, "resize would cause inodes_count overflow"); in ext4_resize_fs()
2053 ext4_get_group_no_and_offset(sb, o_blocks_count - 1, &o_group, &offset); in ext4_resize_fs()
2055 n_desc_blocks = num_desc_blocks(sb, n_group + 1); in ext4_resize_fs()
2056 o_desc_blocks = num_desc_blocks(sb, sbi->s_groups_count); in ext4_resize_fs()
2058 meta_bg = ext4_has_feature_meta_bg(sb); in ext4_resize_fs()
2060 if (ext4_has_feature_resize_inode(sb)) { in ext4_resize_fs()
2062 ext4_error(sb, "resize_inode and meta_bg enabled " in ext4_resize_fs()
2071 n_group = n_desc_blocks * EXT4_DESC_PER_BLOCK(sb); in ext4_resize_fs()
2073 EXT4_BLOCKS_PER_GROUP(sb) + in ext4_resize_fs()
2079 resize_inode = ext4_iget(sb, EXT4_RESIZE_INO, in ext4_resize_fs()
2082 ext4_warning(sb, "Error opening resize inode"); in ext4_resize_fs()
2088 err = ext4_convert_meta_bg(sb, resize_inode); in ext4_resize_fs()
2109 if ((ext4_group_first_block_no(sb, n_group) + in ext4_resize_fs()
2110 ext4_group_overhead_blocks(sb, n_group) + 2 + in ext4_resize_fs()
2112 n_blocks_count = ext4_group_first_block_no(sb, n_group); in ext4_resize_fs()
2126 add = EXT4_C2B(sbi, EXT4_CLUSTERS_PER_GROUP(sb) - (offset + 1)); in ext4_resize_fs()
2128 err = ext4_group_extend_no_check(sb, o_blocks_count, add); in ext4_resize_fs()
2136 err = ext4_alloc_flex_bg_array(sb, n_group + 1); in ext4_resize_fs()
2140 err = ext4_mb_alloc_groupinfo(sb, n_group + 1); in ext4_resize_fs()
2153 while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count)) { in ext4_resize_fs()
2156 ext4_msg(sb, KERN_INFO, in ext4_resize_fs()
2161 if (ext4_alloc_group_tables(sb, flex_gd, flexbg_size) != 0) in ext4_resize_fs()
2163 err = ext4_flex_group_add(sb, resize_inode, flex_gd); in ext4_resize_fs()
2186 ext4_warning(sb, "error (%d) occurred during " in ext4_resize_fs()
2188 ext4_msg(sb, KERN_INFO, "resized filesystem to %llu", in ext4_resize_fs()