Lines Matching full:fs
44 static void fix_uninit_block_bitmaps(ext2_filsys fs);
51 static errcode_t fix_resize_inode(ext2_filsys fs);
52 static errcode_t resize2fs_calculate_summary_stats(ext2_filsys fs);
53 static errcode_t fix_sb_journal_backup(ext2_filsys fs);
54 static errcode_t mark_table_blocks(ext2_filsys fs,
66 static inline int is_block_bm(ext2_filsys fs, unsigned int grp, blk64_t blk) in is_block_bm() argument
68 return blk == ext2fs_block_bitmap_loc(fs, grp); in is_block_bm()
71 static inline int is_inode_bm(ext2_filsys fs, unsigned int grp, blk64_t blk) in is_inode_bm() argument
73 return blk == ext2fs_inode_bitmap_loc(fs, grp); in is_inode_bm()
76 static int is_inode_tb(ext2_filsys fs, unsigned int grp, blk64_t blk) in is_inode_tb() argument
78 return blk >= ext2fs_inode_table_loc(fs, grp) && in is_inode_tb()
79 blk < (ext2fs_inode_table_loc(fs, grp) + in is_inode_tb()
80 fs->inode_blocks_per_group); in is_inode_tb()
84 #define B2C(x) EXT2FS_B2C(fs, (x))
85 #define C2B(x) EXT2FS_C2B(fs, (x))
97 errcode_t resize_fs(ext2_filsys fs, blk64_t *new_size, int flags, in resize_fs() argument
114 fs->priv_data = rfs; in resize_fs()
115 rfs->old_fs = fs; in resize_fs()
120 init_resource_track(&overall_track, "overall resize2fs", fs->io); in resize_fs()
121 init_resource_track(&rtrack, "read_bitmaps", fs->io); in resize_fs()
122 retval = ext2fs_read_bitmaps(fs); in resize_fs()
125 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
127 fs->super->s_state |= EXT2_ERROR_FS; in resize_fs()
128 ext2fs_mark_super_dirty(fs); in resize_fs()
129 ext2fs_flush(fs); in resize_fs()
131 init_resource_track(&rtrack, "fix_uninit_block_bitmaps 1", fs->io); in resize_fs()
132 fix_uninit_block_bitmaps(fs); in resize_fs()
133 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
134 retval = ext2fs_dup_handle(fs, &rfs->new_fs); in resize_fs()
138 init_resource_track(&rtrack, "resize_group_descriptors", fs->io); in resize_fs()
142 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
144 init_resource_track(&rtrack, "move_bg_metadata", fs->io); in resize_fs()
148 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
150 init_resource_track(&rtrack, "zero_high_bits_in_metadata", fs->io); in resize_fs()
154 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
156 init_resource_track(&rtrack, "adjust_superblock", fs->io); in resize_fs()
160 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
162 init_resource_track(&rtrack, "fix_uninit_block_bitmaps 2", fs->io); in resize_fs()
164 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
171 init_resource_track(&rtrack, "blocks_to_move", fs->io); in resize_fs()
175 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
185 init_resource_track(&rtrack, "block_mover", fs->io); in resize_fs()
189 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
191 init_resource_track(&rtrack, "inode_scan_and_fix", fs->io); in resize_fs()
195 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
197 init_resource_track(&rtrack, "inode_ref_fix", fs->io); in resize_fs()
201 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
203 init_resource_track(&rtrack, "move_itables", fs->io); in resize_fs()
207 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
213 init_resource_track(&rtrack, "calculate_summary_stats", fs->io); in resize_fs()
217 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
219 init_resource_track(&rtrack, "fix_resize_inode", fs->io); in resize_fs()
223 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
225 init_resource_track(&rtrack, "fix_sb_journal_backup", fs->io); in resize_fs()
229 print_resource_track(rfs, &rtrack, fs->io); in resize_fs()
238 print_resource_track(rfs, &overall_track, fs->io); in resize_fs()
269 static void adjust_reserved_gdt_blocks(ext2_filsys old_fs, ext2_filsys fs) in adjust_reserved_gdt_blocks() argument
271 if (ext2fs_has_feature_resize_inode(fs->super) && in adjust_reserved_gdt_blocks()
272 (old_fs->desc_blocks != fs->desc_blocks)) { in adjust_reserved_gdt_blocks()
275 new = ((int) fs->super->s_reserved_gdt_blocks) + in adjust_reserved_gdt_blocks()
276 (old_fs->desc_blocks - fs->desc_blocks); in adjust_reserved_gdt_blocks()
279 if (new > (int) fs->blocksize/4) in adjust_reserved_gdt_blocks()
280 new = fs->blocksize/4; in adjust_reserved_gdt_blocks()
281 fs->super->s_reserved_gdt_blocks = new; in adjust_reserved_gdt_blocks()
378 /* Construct bitmaps of super/descriptor blocks in old and new fs */ in move_bg_metadata()
474 static errcode_t zero_high_bits_in_extents(ext2_filsys fs, ext2_ino_t ino, in zero_high_bits_in_extents() argument
485 errcode = ext2fs_extent_open(fs, ino, &handle); in zero_high_bits_in_extents()
514 ext2_filsys fs = rfs->old_fs; in zero_high_bits_in_inodes() local
515 int length = EXT2_INODE_SIZE(fs->super); in zero_high_bits_in_inodes()
524 if (fs->super->s_creator_os == EXT2_OS_HURD) in zero_high_bits_in_inodes()
527 retval = ext2fs_open_inode_scan(fs, 0, &scan); in zero_high_bits_in_inodes()
541 if (!ext2fs_test_inode_bitmap2(fs->inode_map, ino)) in zero_high_bits_in_inodes()
561 retval = ext2fs_write_inode_full(fs, ino, inode, in zero_high_bits_in_inodes()
567 retval = zero_high_bits_in_extents(fs, ino, inode); in zero_high_bits_in_inodes()
583 static void fix_uninit_block_bitmaps(ext2_filsys fs) in fix_uninit_block_bitmaps() argument
589 if (!ext2fs_has_group_desc_csum(fs)) in fix_uninit_block_bitmaps()
592 for (g=0; g < fs->group_desc_count; g++) { in fix_uninit_block_bitmaps()
593 if (!(ext2fs_bg_flags_test(fs, g, EXT2_BG_BLOCK_UNINIT))) in fix_uninit_block_bitmaps()
596 blk = ext2fs_group_first_block2(fs, g); in fix_uninit_block_bitmaps()
597 lblk = ext2fs_group_last_block2(fs, g); in fix_uninit_block_bitmaps()
598 ext2fs_unmark_block_bitmap_range2(fs->block_map, blk, in fix_uninit_block_bitmaps()
601 ext2fs_reserve_super_and_bgd(fs, g, fs->block_map); in fix_uninit_block_bitmaps()
602 ext2fs_mark_block_bitmap2(fs->block_map, in fix_uninit_block_bitmaps()
603 ext2fs_block_bitmap_loc(fs, g)); in fix_uninit_block_bitmaps()
604 ext2fs_mark_block_bitmap2(fs->block_map, in fix_uninit_block_bitmaps()
605 ext2fs_inode_bitmap_loc(fs, g)); in fix_uninit_block_bitmaps()
606 for (i = 0, blk = ext2fs_inode_table_loc(fs, g); in fix_uninit_block_bitmaps()
607 i < fs->inode_blocks_per_group; in fix_uninit_block_bitmaps()
609 ext2fs_mark_block_bitmap2(fs->block_map, blk); in fix_uninit_block_bitmaps()
629 static errcode_t free_gdp_blocks(ext2_filsys fs, in free_gdp_blocks() argument
639 dgrp_t count = old_fs->group_desc_count - fs->group_desc_count; in free_gdp_blocks()
642 if (EXT2FS_CLUSTER_RATIO(fs) > 1) { in free_gdp_blocks()
643 retval = ext2fs_allocate_block_bitmap(fs, "bgdata", &bg_map); in free_gdp_blocks()
647 retval = mark_table_blocks(fs, bg_map); in free_gdp_blocks()
655 (blk < ext2fs_blocks_count(fs->super)) && in free_gdp_blocks()
657 ext2fs_block_alloc_stats2(fs, blk, -1); in free_gdp_blocks()
663 (blk < ext2fs_blocks_count(fs->super)) && in free_gdp_blocks()
665 ext2fs_block_alloc_stats2(fs, blk, -1); in free_gdp_blocks()
671 j < fs->inode_blocks_per_group; j++, blk++) { in free_gdp_blocks()
672 if (blk >= ext2fs_blocks_count(fs->super) || in free_gdp_blocks()
675 ext2fs_block_alloc_stats2(fs, blk, -1); in free_gdp_blocks()
690 errcode_t adjust_fs_info(ext2_filsys fs, ext2_filsys old_fs, in adjust_fs_info() argument
705 ext2fs_blocks_count_set(fs->super, new_size); in adjust_fs_info()
706 fs->super->s_overhead_clusters = 0; in adjust_fs_info()
709 fs->group_desc_count = ext2fs_div64_ceil(ext2fs_blocks_count(fs->super) - in adjust_fs_info()
710 fs->super->s_first_data_block, in adjust_fs_info()
711 EXT2_BLOCKS_PER_GROUP(fs->super)); in adjust_fs_info()
712 if (fs->group_desc_count == 0) in adjust_fs_info()
714 fs->desc_blocks = ext2fs_div_ceil(fs->group_desc_count, in adjust_fs_info()
715 EXT2_DESC_PER_BLOCK(fs->super)); in adjust_fs_info()
723 overhead = (int) (2 + fs->inode_blocks_per_group); in adjust_fs_info()
726 if (ext2fs_has_feature_sparse_super2(fs->super)) { in adjust_fs_info()
731 if (fs->group_desc_count == 2) in adjust_fs_info()
732 has_bg = fs->super->s_backup_bgs[0] != 0; in adjust_fs_info()
734 has_bg = fs->super->s_backup_bgs[1] != 0; in adjust_fs_info()
736 has_bg = ext2fs_bg_has_super(fs, fs->group_desc_count - 1); in adjust_fs_info()
738 overhead += 1 + fs->desc_blocks + in adjust_fs_info()
739 fs->super->s_reserved_gdt_blocks; in adjust_fs_info()
746 rem = (ext2fs_blocks_count(fs->super) - fs->super->s_first_data_block) % in adjust_fs_info()
747 fs->super->s_blocks_per_group; in adjust_fs_info()
748 if ((fs->group_desc_count == 1) && rem && (rem < overhead)) in adjust_fs_info()
750 if ((fs->group_desc_count > 1) && rem && (rem < overhead+50)) { in adjust_fs_info()
751 ext2fs_blocks_count_set(fs->super, in adjust_fs_info()
752 ext2fs_blocks_count(fs->super) - rem); in adjust_fs_info()
758 new_inodes =(unsigned long long) fs->super->s_inodes_per_group * fs->group_desc_count; in adjust_fs_info()
760 new_inodes = (unsigned long long) fs->super->s_inodes_per_group * (fs->group_desc_count - 1); in adjust_fs_info()
763 ((unsigned long long) fs->super->s_blocks_per_group * in adjust_fs_info()
764 (fs->group_desc_count - 1)) + fs->super->s_first_data_block; in adjust_fs_info()
766 ext2fs_blocks_count_set(fs->super, new_blocks); in adjust_fs_info()
773 fs->super->s_inodes_count = fs->super->s_inodes_per_group * in adjust_fs_info()
774 fs->group_desc_count; in adjust_fs_info()
780 if (blk > ext2fs_blocks_count(fs->super)) in adjust_fs_info()
781 ext2fs_free_blocks_count_set(fs->super, in adjust_fs_info()
782 ext2fs_free_blocks_count(fs->super) - in adjust_fs_info()
783 (blk - ext2fs_blocks_count(fs->super))); in adjust_fs_info()
785 ext2fs_free_blocks_count_set(fs->super, in adjust_fs_info()
786 ext2fs_free_blocks_count(fs->super) + in adjust_fs_info()
787 (ext2fs_blocks_count(fs->super) - blk)); in adjust_fs_info()
794 ext2fs_r_blocks_count_set(fs->super, in adjust_fs_info()
795 (percent * ext2fs_blocks_count(fs->super) / in adjust_fs_info()
801 retval = ext2fs_resize_inode_bitmap2(fs->super->s_inodes_count, in adjust_fs_info()
802 fs->super->s_inodes_count, in adjust_fs_info()
803 fs->inode_map); in adjust_fs_info()
806 real_end = EXT2_GROUPS_TO_BLOCKS(fs->super, fs->group_desc_count) - 1 + in adjust_fs_info()
807 fs->super->s_first_data_block; in adjust_fs_info()
809 real_end, fs->block_map); in adjust_fs_info()
825 if (EXT2_DESC_SIZE(old_fs->super) == EXT2_DESC_SIZE(fs->super) && in adjust_fs_info()
826 old_fs->desc_blocks != fs->desc_blocks) { in adjust_fs_info()
828 fs->blocksize, in adjust_fs_info()
829 fs->desc_blocks * fs->blocksize, in adjust_fs_info()
830 &fs->group_desc); in adjust_fs_info()
833 if (fs->desc_blocks > old_fs->desc_blocks) in adjust_fs_info()
834 memset((char *) fs->group_desc + in adjust_fs_info()
835 (old_fs->desc_blocks * fs->blocksize), 0, in adjust_fs_info()
836 (fs->desc_blocks - old_fs->desc_blocks) * in adjust_fs_info()
837 fs->blocksize); in adjust_fs_info()
848 if (EXT2_DESC_SIZE(old_fs->super) == EXT2_DESC_SIZE(fs->super)) in adjust_fs_info()
849 adjust_reserved_gdt_blocks(old_fs, fs); in adjust_fs_info()
851 if (ext2fs_has_feature_meta_bg(fs->super) && in adjust_fs_info()
852 (fs->super->s_first_meta_bg > fs->desc_blocks)) { in adjust_fs_info()
853 ext2fs_clear_feature_meta_bg(fs->super); in adjust_fs_info()
854 fs->super->s_first_meta_bg = 0; in adjust_fs_info()
861 if (ext2fs_has_feature_sparse_super2(fs->super)) { in adjust_fs_info()
862 dgrp_t last_bg = fs->group_desc_count - 1; in adjust_fs_info()
867 fs->super->s_backup_bgs[0] = 1; in adjust_fs_info()
869 fs->group_desc_count > 2) || in adjust_fs_info()
870 fs->super->s_backup_bgs[1]) in adjust_fs_info()
871 fs->super->s_backup_bgs[1] = last_bg; in adjust_fs_info()
873 if (fs->super->s_backup_bgs[0] > last_bg) in adjust_fs_info()
874 fs->super->s_backup_bgs[0] = 0; in adjust_fs_info()
875 if (fs->super->s_backup_bgs[1] > last_bg) in adjust_fs_info()
876 fs->super->s_backup_bgs[1] = 0; in adjust_fs_info()
879 fs->super->s_backup_bgs[1] = last_bg; in adjust_fs_info()
887 if (old_fs->group_desc_count > fs->group_desc_count) { in adjust_fs_info()
892 retval = free_gdp_blocks(fs, reserve_blocks, old_fs, in adjust_fs_info()
893 fs->group_desc_count); in adjust_fs_info()
905 if (old_fs->group_desc_count == fs->group_desc_count) { in adjust_fs_info()
906 numblocks = (ext2fs_blocks_count(fs->super) - in adjust_fs_info()
907 fs->super->s_first_data_block) % in adjust_fs_info()
908 fs->super->s_blocks_per_group; in adjust_fs_info()
910 numblocks = fs->super->s_blocks_per_group; in adjust_fs_info()
912 numblocks = fs->super->s_blocks_per_group; in adjust_fs_info()
914 …ext2fs_bg_free_blocks_count_set(fs, i, ext2fs_bg_free_blocks_count(fs, i) + (numblocks - old_numbl… in adjust_fs_info()
915 ext2fs_group_desc_csum_set(fs, i); in adjust_fs_info()
922 if (old_fs->group_desc_count >= fs->group_desc_count) { in adjust_fs_info()
930 group_block = ext2fs_group_first_block2(fs, in adjust_fs_info()
932 csum_flag = ext2fs_has_group_desc_csum(fs); in adjust_fs_info()
935 access("/sys/fs/ext4/features/lazy_itable_init", F_OK) == 0)) in adjust_fs_info()
937 if (ext2fs_has_feature_meta_bg(fs->super)) in adjust_fs_info()
938 old_desc_blocks = fs->super->s_first_meta_bg; in adjust_fs_info()
940 old_desc_blocks = fs->desc_blocks + in adjust_fs_info()
941 fs->super->s_reserved_gdt_blocks; in adjust_fs_info()
949 ext2fs_reserve_super_and_bgd(fs, i, fs->block_map); in adjust_fs_info()
952 i < fs->group_desc_count; i++) { in adjust_fs_info()
953 memset(ext2fs_group_desc(fs, fs->group_desc, i), 0, in adjust_fs_info()
957 ext2fs_bg_flags_zap(fs, i); in adjust_fs_info()
959 ext2fs_bg_flags_set(fs, i, EXT2_BG_INODE_UNINIT); in adjust_fs_info()
961 ext2fs_bg_flags_set(fs, i, in adjust_fs_info()
963 ext2fs_bg_itable_unused_set(fs, i, in adjust_fs_info()
964 fs->super->s_inodes_per_group); in adjust_fs_info()
967 numblocks = ext2fs_group_blocks_count(fs, i); in adjust_fs_info()
968 if ((i < fs->group_desc_count - 1) && csum_flag) in adjust_fs_info()
969 ext2fs_bg_flags_set(fs, i, EXT2_BG_BLOCK_UNINIT); in adjust_fs_info()
971 has_super = ext2fs_bg_has_super(fs, i); in adjust_fs_info()
973 ext2fs_block_alloc_stats2(fs, group_block, +1); in adjust_fs_info()
976 meta_bg_size = EXT2_DESC_PER_BLOCK(fs->super); in adjust_fs_info()
978 if (!ext2fs_has_feature_meta_bg(fs->super) || in adjust_fs_info()
979 (meta_bg < fs->super->s_first_meta_bg)) { in adjust_fs_info()
982 ext2fs_block_alloc_stats2(fs, in adjust_fs_info()
992 ext2fs_block_alloc_stats2(fs, in adjust_fs_info()
996 adjblocks += 2 + fs->inode_blocks_per_group; in adjust_fs_info()
999 ext2fs_free_blocks_count_set(fs->super, in adjust_fs_info()
1000 ext2fs_free_blocks_count(fs->super) - adjblocks); in adjust_fs_info()
1001 fs->super->s_free_inodes_count += in adjust_fs_info()
1002 fs->super->s_inodes_per_group; in adjust_fs_info()
1003 ext2fs_bg_free_blocks_count_set(fs, i, numblocks); in adjust_fs_info()
1004 ext2fs_bg_free_inodes_count_set(fs, i, in adjust_fs_info()
1005 fs->super->s_inodes_per_group); in adjust_fs_info()
1006 ext2fs_bg_used_dirs_count_set(fs, i, 0); in adjust_fs_info()
1007 ext2fs_group_desc_csum_set(fs, i); in adjust_fs_info()
1009 retval = ext2fs_allocate_group_table(fs, i, 0); in adjust_fs_info()
1012 group_block += fs->super->s_blocks_per_group; in adjust_fs_info()
1025 mark_table_blocks(fs, reserve_blocks); in adjust_fs_info()
1037 void adjust_new_size(ext2_filsys fs, blk64_t *sizep) in adjust_new_size() argument
1048 fs->super->s_first_data_block, in adjust_new_size()
1049 EXT2_BLOCKS_PER_GROUP(fs->super)); in adjust_new_size()
1053 EXT2_DESC_PER_BLOCK(fs->super)); in adjust_new_size()
1061 overhead = (int) (2 + fs->inode_blocks_per_group); in adjust_new_size()
1064 if (ext2fs_has_feature_sparse_super2(fs->super)) { in adjust_new_size()
1070 has_bg = fs->super->s_backup_bgs[0] != 0; in adjust_new_size()
1072 has_bg = fs->super->s_backup_bgs[1] != 0; in adjust_new_size()
1074 has_bg = ext2fs_bg_has_super(fs, group_desc_count - 1); in adjust_new_size()
1077 fs->super->s_reserved_gdt_blocks; in adjust_new_size()
1084 rem = (size - fs->super->s_first_data_block) % in adjust_new_size()
1085 fs->super->s_blocks_per_group; in adjust_new_size()
1097 new_inodes =(unsigned long long) fs->super->s_inodes_per_group * group_desc_count; in adjust_new_size()
1099 new_inodes = (unsigned long long) fs->super->s_inodes_per_group * (group_desc_count - 1); in adjust_new_size()
1102 size = ((unsigned long long) fs->super->s_blocks_per_group * in adjust_new_size()
1103 (group_desc_count - 1)) + fs->super->s_first_data_block; in adjust_new_size()
1116 ext2_filsys fs = rfs->new_fs; in adjust_superblock() local
1122 ext2fs_mark_super_dirty(fs); in adjust_superblock()
1123 ext2fs_mark_bb_dirty(fs); in adjust_superblock()
1124 ext2fs_mark_ib_dirty(fs); in adjust_superblock()
1126 retval = ext2fs_allocate_block_bitmap(fs, _("reserved blocks"), in adjust_superblock()
1131 retval = adjust_fs_info(fs, rfs->old_fs, rfs->reserve_blocks, new_size); in adjust_superblock()
1149 if (rfs->old_fs->group_desc_count > fs->group_desc_count) { in adjust_superblock()
1159 if (rfs->old_fs->group_desc_count >= fs->group_desc_count) { in adjust_superblock()
1169 if (lazy_itable_init && ext2fs_has_group_desc_csum(fs)) { in adjust_superblock()
1177 retval = ext2fs_get_array(fs->blocksize, fs->inode_blocks_per_group, in adjust_superblock()
1182 memset(rfs->itable_buf, 0, fs->blocksize * fs->inode_blocks_per_group); in adjust_superblock()
1184 max_group = fs->group_desc_count - adj; in adjust_superblock()
1192 i < fs->group_desc_count; i++) { in adjust_superblock()
1196 retval = ext2fs_zero_blocks2(fs, ext2fs_inode_table_loc(fs, i), in adjust_superblock()
1197 fs->inode_blocks_per_group, NULL, in adjust_superblock()
1202 io_channel_flush(fs->io); in adjust_superblock()
1210 io_channel_flush(fs->io); in adjust_superblock()
1233 static errcode_t mark_table_blocks(ext2_filsys fs, in mark_table_blocks() argument
1239 for (i = 0; i < fs->group_desc_count; i++) { in mark_table_blocks()
1240 ext2fs_reserve_super_and_bgd(fs, i, bmap); in mark_table_blocks()
1245 blk = ext2fs_inode_table_loc(fs, i); in mark_table_blocks()
1248 fs->inode_blocks_per_group); in mark_table_blocks()
1253 blk = ext2fs_block_bitmap_loc(fs, i); in mark_table_blocks()
1260 blk = ext2fs_inode_bitmap_loc(fs, i); in mark_table_blocks()
1265 if (ext2fs_has_feature_mmp(fs->super) && in mark_table_blocks()
1266 fs->super->s_mmp_block > fs->super->s_first_data_block && in mark_table_blocks()
1267 fs->super->s_mmp_block < ext2fs_blocks_count(fs->super)) in mark_table_blocks()
1268 ext2fs_mark_block_bitmap2(bmap, fs->super->s_mmp_block); in mark_table_blocks()
1281 ext2_filsys fs = rfs->new_fs; in mark_fs_metablock() local
1284 ext2fs_block_alloc_stats2(fs, blk, +1); in mark_fs_metablock()
1291 if (is_block_bm(fs, group, blk)) { in mark_fs_metablock()
1292 ext2fs_block_bitmap_loc_set(fs, group, 0); in mark_fs_metablock()
1296 if (is_inode_bm(fs, group, blk)) { in mark_fs_metablock()
1297 ext2fs_inode_bitmap_loc_set(fs, group, 0); in mark_fs_metablock()
1301 if (is_inode_tb(fs, group, blk)) { in mark_fs_metablock()
1302 ext2fs_inode_table_loc_set(fs, group, 0); in mark_fs_metablock()
1306 if (ext2fs_has_feature_flex_bg(fs->super)) { in mark_fs_metablock()
1310 if (is_block_bm(fs, i, blk)) { in mark_fs_metablock()
1311 ext2fs_block_bitmap_loc_set(fs, i, 0); in mark_fs_metablock()
1315 if (is_inode_bm(fs, i, blk)) { in mark_fs_metablock()
1316 ext2fs_inode_bitmap_loc_set(fs, i, 0); in mark_fs_metablock()
1320 if (is_inode_tb(fs, i, blk)) { in mark_fs_metablock()
1321 ext2fs_inode_table_loc_set(fs, i, 0); in mark_fs_metablock()
1328 if (ext2fs_has_group_desc_csum(fs) && in mark_fs_metablock()
1329 (ext2fs_bg_flags_test(fs, group, EXT2_BG_BLOCK_UNINIT))) { in mark_fs_metablock()
1359 ext2_filsys fs, old_fs; in blocks_to_move() local
1363 fs = rfs->new_fs; in blocks_to_move()
1365 if (ext2fs_blocks_count(old_fs->super) > ext2fs_blocks_count(fs->super)) in blocks_to_move()
1366 fs = rfs->old_fs; in blocks_to_move()
1368 retval = ext2fs_allocate_block_bitmap(fs, _("blocks to be moved"), in blocks_to_move()
1373 retval = ext2fs_allocate_block_bitmap(fs, _("meta-data blocks"), in blocks_to_move()
1382 fs = rfs->new_fs; in blocks_to_move()
1390 new_size = ext2fs_blocks_count(fs->super); in blocks_to_move()
1392 for (g = 0; g < fs->group_desc_count; g++) { in blocks_to_move()
1398 if (ext2fs_block_bitmap_loc(fs, g) >= new_size) { in blocks_to_move()
1399 ext2fs_block_bitmap_loc_set(fs, g, 0); in blocks_to_move()
1402 if (ext2fs_inode_bitmap_loc(fs, g) >= new_size) { in blocks_to_move()
1403 ext2fs_inode_bitmap_loc_set(fs, g, 0); in blocks_to_move()
1406 if ((ext2fs_inode_table_loc(fs, g) + in blocks_to_move()
1407 fs->inode_blocks_per_group) > new_size) { in blocks_to_move()
1408 ext2fs_inode_table_loc_set(fs, g, 0); in blocks_to_move()
1413 retval = ext2fs_allocate_group_table(fs, g, 0); in blocks_to_move()
1424 for (blk = ext2fs_blocks_count(fs->super); in blocks_to_move()
1426 g = ext2fs_group_of_blk2(fs, blk); in blocks_to_move()
1427 if (ext2fs_has_group_desc_csum(fs) && in blocks_to_move()
1433 blk = ext2fs_group_first_block2(fs, g+1) - 1; in blocks_to_move()
1449 if (ext2fs_has_feature_meta_bg(fs->super)) in blocks_to_move()
1450 new_blocks = fs->super->s_first_meta_bg; in blocks_to_move()
1452 new_blocks = fs->desc_blocks + fs->super->s_reserved_gdt_blocks; in blocks_to_move()
1465 max_groups = fs->group_desc_count; in blocks_to_move()
1475 if (EXT2FS_CLUSTER_RATIO(fs) > 1) { in blocks_to_move()
1476 retval = ext2fs_allocate_block_bitmap(fs, in blocks_to_move()
1482 retval = mark_table_blocks(fs, new_meta_bmap); in blocks_to_move()
1489 group_blk += fs->super->s_blocks_per_group; in blocks_to_move()
1499 EXT2FS_CLUSTER_RATIO(fs) - in blocks_to_move()
1501 EXT2FS_CLUSTER_MASK(fs)); in blocks_to_move()
1504 ext2fs_block_alloc_stats2(fs, blk, -1); in blocks_to_move()
1505 blk += EXT2FS_CLUSTER_RATIO(fs); in blocks_to_move()
1512 group_blk += fs->super->s_blocks_per_group; in blocks_to_move()
1521 meta_bg_size = EXT2_DESC_PER_BLOCK(fs->super); in blocks_to_move()
1522 flex_bg = ext2fs_has_feature_flex_bg(fs->super); in blocks_to_move()
1523 /* first reserve all of the existing fs meta blocks */ in blocks_to_move()
1525 has_super = ext2fs_bg_has_super(fs, i); in blocks_to_move()
1530 if (!ext2fs_has_feature_meta_bg(fs->super) || in blocks_to_move()
1531 (meta_bg < fs->super->s_first_meta_bg)) { in blocks_to_move()
1553 * overwriting fs metadata (especially inode table in blocks_to_move()
1556 * reserve all existing fs metadata blocks. in blocks_to_move()
1558 if (ext2fs_block_bitmap_loc(fs, i)) in blocks_to_move()
1560 ext2fs_block_bitmap_loc(fs, i)); in blocks_to_move()
1565 if (ext2fs_inode_bitmap_loc(fs, i)) in blocks_to_move()
1567 ext2fs_inode_bitmap_loc(fs, i)); in blocks_to_move()
1572 if (ext2fs_inode_table_loc(fs, i)) in blocks_to_move()
1574 ext2fs_inode_table_loc(fs, i), in blocks_to_move()
1575 fs->inode_blocks_per_group); in blocks_to_move()
1586 if (ext2fs_inode_table_loc(fs, i) && in blocks_to_move()
1587 ext2fs_inode_bitmap_loc(fs, i) && in blocks_to_move()
1588 ext2fs_block_bitmap_loc(fs, i)) in blocks_to_move()
1591 retval = ext2fs_allocate_group_table(fs, i, in blocks_to_move()
1601 (blk = ext2fs_block_bitmap_loc(fs, i))) { in blocks_to_move()
1602 ext2fs_block_alloc_stats2(fs, blk, +1); in blocks_to_move()
1610 (blk = ext2fs_inode_bitmap_loc(fs, i))) { in blocks_to_move()
1611 ext2fs_block_alloc_stats2(fs, blk, +1); in blocks_to_move()
1626 if (ext2fs_inode_table_loc(fs, i) == ext2fs_inode_table_loc(old_fs, i)) in blocks_to_move()
1629 rfs->needed_blocks += fs->inode_blocks_per_group; in blocks_to_move()
1636 for (blk = ext2fs_inode_table_loc(fs, i), j=0; in blocks_to_move()
1637 j < fs->inode_blocks_per_group ; j++, blk++) { in blocks_to_move()
1638 ext2fs_block_alloc_stats2(fs, blk, +1); in blocks_to_move()
1651 j < fs->inode_blocks_per_group ; j++, blk++) in blocks_to_move()
1696 ext2_filsys fs = rfs->new_fs; in get_new_block() local
1699 if (rfs->new_blk >= ext2fs_blocks_count(fs->super)) { in get_new_block()
1709 rfs->new_blk = fs->super->s_first_data_block; in get_new_block()
1712 if (ext2fs_test_block_bitmap2(fs->block_map, rfs->new_blk) || in get_new_block()
1726 static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, in resize2fs_get_alloc_block() argument
1730 ext2_resize_t rfs = (ext2_resize_t) fs->priv_data; in resize2fs_get_alloc_block()
1759 ext2_filsys fs = rfs->new_fs; in block_mover() local
1767 fs->get_alloc_block = resize2fs_get_alloc_block; in block_mover()
1774 new_blk = fs->super->s_first_data_block; in block_mover()
1776 retval = ext2fs_get_array(fs->blocksize, in block_mover()
1777 fs->inode_blocks_per_group, in block_mover()
1794 blk += EXT2FS_CLUSTER_RATIO(fs)) { in block_mover()
1810 ext2fs_block_alloc_stats2(fs, new_blk, +1); in block_mover()
1853 if (c > fs->inode_blocks_per_group) in block_mover()
1854 c = fs->inode_blocks_per_group; in block_mover()
1855 retval = io_channel_read_blk64(fs->io, old_blk, c, in block_mover()
1858 retval = io_channel_write_blk64(fs->io, new_blk, c, in block_mover()
1866 io_channel_flush(fs->io); in block_mover()
1874 io_channel_flush(fs->io); in block_mover()
1901 static __u64 extent_translate(ext2_filsys fs, ext2_extent extent, __u64 old_loc) in extent_translate() argument
1906 new_block += old_loc & (EXT2FS_CLUSTER_RATIO(fs) - 1); in extent_translate()
1921 static int process_block(ext2_filsys fs, blk64_t *block_nr, in process_block() argument
1934 new_block = extent_translate(fs, pb->rfs->bmap, block); in process_block()
1951 retval = ext2fs_add_dir_block2(fs->dblist, pb->ino, in process_block()
1964 static errcode_t progress_callback(ext2_filsys fs, in progress_callback() argument
1979 io_channel_flush(fs->io); in progress_callback()
1981 group+1, fs->group_desc_count); in progress_callback()
2103 ext2_filsys fs = rfs->new_fs; in fix_ea_inode_refs() local
2106 int inode_size = EXT2_INODE_SIZE(fs->super); in fix_ea_inode_refs()
2117 retval = ext2fs_open_inode_scan(fs, 0, &scan); in fix_ea_inode_refs()
2137 retval = ext2fs_write_inode_full(fs, ino, inode, in fix_ea_inode_refs()
2144 blk = ext2fs_file_acl_block(fs, inode); in fix_ea_inode_refs()
2146 retval = ext2fs_read_ext_attr3(fs, blk, block_buf, ino); in fix_ea_inode_refs()
2151 fs->blocksize, in fix_ea_inode_refs()
2154 retval = ext2fs_write_ext_attr3(fs, blk, in fix_ea_inode_refs()
2394 * old fs, then we must rewrite all dir blocks with new checksums. in check_and_change_inodes()
2501 ext2_filsys fs = rfs->new_fs; in move_itables() local
2509 max_groups = fs->group_desc_count; in move_itables()
2513 size = fs->blocksize * fs->inode_blocks_per_group; in move_itables()
2520 if (EXT2FS_CLUSTER_RATIO(fs) > 1) { in move_itables()
2521 retval = ext2fs_allocate_block_bitmap(fs, _("new meta blocks"), in move_itables()
2526 retval = mark_table_blocks(fs, new_bmap); in move_itables()
2537 ext2fs_inode_table_loc(fs, i)) in move_itables()
2556 new_blk = ext2fs_inode_table_loc(fs, i); in move_itables()
2571 retval = io_channel_read_blk64(fs->io, old_blk, in move_itables()
2572 fs->inode_blocks_per_group, in move_itables()
2586 n = n >> EXT2_BLOCK_SIZE_BITS(fs->super); in move_itables()
2591 num = fs->inode_blocks_per_group; in move_itables()
2595 retval = io_channel_write_blk64(fs->io, new_blk, in move_itables()
2598 io_channel_write_blk64(fs->io, old_blk, in move_itables()
2603 retval = io_channel_write_blk64(fs->io, in move_itables()
2604 old_blk + fs->inode_blocks_per_group, in move_itables()
2606 (fs->inode_blocks_per_group - diff) * in move_itables()
2607 fs->blocksize)); in move_itables()
2613 j < fs->inode_blocks_per_group;) { in move_itables()
2616 ext2fs_block_alloc_stats2(fs, blk, -1); in move_itables()
2617 cluster_freed = EXT2FS_CLUSTER_RATIO(fs) - in move_itables()
2618 (blk & EXT2FS_CLUSTER_MASK(fs)); in move_itables()
2639 mark_table_blocks(fs, fs->block_map); in move_itables()
2640 ext2fs_flush(fs); in move_itables()
2660 ext2_filsys fs = rfs->new_fs; in clear_sparse_super2_last_group() local
2664 dgrp_t last_bg = fs->group_desc_count - 1; in clear_sparse_super2_last_group()
2668 if (!ext2fs_has_feature_sparse_super2(fs->super)) in clear_sparse_super2_last_group()
2674 if (fs->super->s_backup_bgs[0] == old_fs->super->s_backup_bgs[0] && in clear_sparse_super2_last_group()
2675 fs->super->s_backup_bgs[1] == old_fs->super->s_backup_bgs[1]) in clear_sparse_super2_last_group()
2682 if (fs->super->s_backup_bgs[0] == old_last_bg || in clear_sparse_super2_last_group()
2683 fs->super->s_backup_bgs[1] == old_last_bg) in clear_sparse_super2_last_group()
2695 ext2fs_unmark_block_bitmap2(fs->block_map, sb); in clear_sparse_super2_last_group()
2697 ext2fs_unmark_block_bitmap_range2(fs->block_map, old_desc, num); in clear_sparse_super2_last_group()
2705 * Unfortunately, those blocks may be used by other files or fs
2711 ext2_filsys fs = rfs->new_fs; in reserve_sparse_super2_last_group() local
2715 dgrp_t last_bg = fs->group_desc_count - 1; in reserve_sparse_super2_last_group()
2721 if (!ext2fs_has_feature_sparse_super2(fs->super)) in reserve_sparse_super2_last_group()
2727 if (fs->super->s_backup_bgs[0] == old_fs->super->s_backup_bgs[0] && in reserve_sparse_super2_last_group()
2728 fs->super->s_backup_bgs[1] == old_fs->super->s_backup_bgs[1]) in reserve_sparse_super2_last_group()
2731 if (fs->super->s_backup_bgs[0] != last_bg && in reserve_sparse_super2_last_group()
2732 fs->super->s_backup_bgs[1] != last_bg) in reserve_sparse_super2_last_group()
2758 ext2fs_mark_block_bitmap_range2(fs->block_map, sb, num); in reserve_sparse_super2_last_group()
2760 for (g = 0; g < fs->group_desc_count; g++) { in reserve_sparse_super2_last_group()
2763 mb = ext2fs_block_bitmap_loc(fs, g); in reserve_sparse_super2_last_group()
2765 ext2fs_block_bitmap_loc_set(fs, g, 0); in reserve_sparse_super2_last_group()
2768 mb = ext2fs_inode_bitmap_loc(fs, g); in reserve_sparse_super2_last_group()
2770 ext2fs_inode_bitmap_loc_set(fs, g, 0); in reserve_sparse_super2_last_group()
2773 mb = ext2fs_inode_table_loc(fs, g); in reserve_sparse_super2_last_group()
2775 (sb < mb + fs->inode_blocks_per_group)) { in reserve_sparse_super2_last_group()
2776 ext2fs_inode_table_loc_set(fs, g, 0); in reserve_sparse_super2_last_group()
2780 retval = ext2fs_allocate_group_table(fs, g, 0); in reserve_sparse_super2_last_group()
2800 static errcode_t fix_resize_inode(ext2_filsys fs) in fix_resize_inode() argument
2805 if (!ext2fs_has_feature_resize_inode(fs->super)) in fix_resize_inode()
2808 retval = ext2fs_read_inode(fs, EXT2_RESIZE_INO, &inode); in fix_resize_inode()
2811 ext2fs_iblk_set(fs, &inode, 1); in fix_resize_inode()
2813 retval = ext2fs_write_inode(fs, EXT2_RESIZE_INO, &inode); in fix_resize_inode()
2827 retval = ext2fs_zero_blocks2(fs, inode.i_block[EXT2_DIND_BLOCK], 1, in fix_resize_inode()
2832 retval = ext2fs_create_resize_inode(fs); in fix_resize_inode()
2843 static errcode_t resize2fs_calculate_summary_stats(ext2_filsys fs) in resize2fs_calculate_summary_stats() argument
2846 blk64_t blk = fs->super->s_first_data_block; in resize2fs_calculate_summary_stats()
2858 bitmap_buf = malloc(fs->blocksize); in resize2fs_calculate_summary_stats()
2861 for (group = 0; group < fs->group_desc_count; in resize2fs_calculate_summary_stats()
2863 retval = ext2fs_get_block_bitmap_range2(fs->block_map, in resize2fs_calculate_summary_stats()
2864 B2C(blk), fs->super->s_clusters_per_group, bitmap_buf); in resize2fs_calculate_summary_stats()
2870 fs->super->s_clusters_per_group / 8); in resize2fs_calculate_summary_stats()
2871 group_free = fs->super->s_clusters_per_group - n; in resize2fs_calculate_summary_stats()
2873 ext2fs_bg_free_blocks_count_set(fs, group, group_free); in resize2fs_calculate_summary_stats()
2874 ext2fs_group_desc_csum_set(fs, group); in resize2fs_calculate_summary_stats()
2875 blk += fs->super->s_blocks_per_group; in resize2fs_calculate_summary_stats()
2878 ext2fs_free_blocks_count_set(fs->super, C2B(total_clusters_free)); in resize2fs_calculate_summary_stats()
2888 uninit = ext2fs_bg_flags_test(fs, group, EXT2_BG_INODE_UNINIT); in resize2fs_calculate_summary_stats()
2889 for (ino = 1; ino <= fs->super->s_inodes_count && ino > 0; ino++) { in resize2fs_calculate_summary_stats()
2891 !ext2fs_fast_test_inode_bitmap2(fs->inode_map, ino)) { in resize2fs_calculate_summary_stats()
2896 if ((count == fs->super->s_inodes_per_group) || in resize2fs_calculate_summary_stats()
2897 (ino == fs->super->s_inodes_count)) { in resize2fs_calculate_summary_stats()
2898 ext2fs_bg_free_inodes_count_set(fs, group, group_free); in resize2fs_calculate_summary_stats()
2899 ext2fs_group_desc_csum_set(fs, group); in resize2fs_calculate_summary_stats()
2901 if (group >= fs->group_desc_count) in resize2fs_calculate_summary_stats()
2905 uninit = ext2fs_bg_flags_test(fs, group, EXT2_BG_INODE_UNINIT); in resize2fs_calculate_summary_stats()
2908 fs->super->s_free_inodes_count = total_inodes_free; in resize2fs_calculate_summary_stats()
2909 ext2fs_mark_super_dirty(fs); in resize2fs_calculate_summary_stats()
2917 static errcode_t fix_sb_journal_backup(ext2_filsys fs) in fix_sb_journal_backup() argument
2922 if (!ext2fs_has_feature_journal(fs->super)) in fix_sb_journal_backup()
2926 if (fs->super->s_journal_dev && !fs->super->s_journal_inum) in fix_sb_journal_backup()
2929 retval = ext2fs_read_inode(fs, fs->super->s_journal_inum, &inode); in fix_sb_journal_backup()
2932 memcpy(fs->super->s_jnl_blocks, inode.i_block, EXT2_N_BLOCKS*4); in fix_sb_journal_backup()
2933 fs->super->s_jnl_blocks[15] = inode.i_size_high; in fix_sb_journal_backup()
2934 fs->super->s_jnl_blocks[16] = inode.i_size; in fix_sb_journal_backup()
2935 fs->super->s_jnl_backup_type = EXT3_JNL_BACKUP_BLOCKS; in fix_sb_journal_backup()
2936 ext2fs_mark_super_dirty(fs); in fix_sb_journal_backup()
2940 static int calc_group_overhead(ext2_filsys fs, blk64_t grp, in calc_group_overhead() argument
2947 overhead = fs->inode_blocks_per_group + 2; in calc_group_overhead()
2949 ext2fs_super_and_bgd_loc2(fs, grp, &super_blk, in calc_group_overhead()
2962 * calculate the minimum number of blocks the given fs can be resized to
2964 blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags) in calculate_minimum_resize_size() argument
2972 unsigned flexbg_size = 1U << fs->super->s_log_groups_per_flex; in calculate_minimum_resize_size()
2978 inode_count = fs->super->s_inodes_count - in calculate_minimum_resize_size()
2979 fs->super->s_free_inodes_count; in calculate_minimum_resize_size()
2981 fs->super->s_inodes_per_group) * in calculate_minimum_resize_size()
2982 (blk64_t) EXT2_BLOCKS_PER_GROUP(fs->super); in calculate_minimum_resize_size()
2984 EXT2_BLOCKS_PER_GROUP(fs->super)); in calculate_minimum_resize_size()
2987 printf("fs has %d inodes, %d groups required.\n", in calculate_minimum_resize_size()
2994 if (ext2fs_has_feature_meta_bg(fs->super)) in calculate_minimum_resize_size()
2995 old_desc_blocks = fs->super->s_first_meta_bg; in calculate_minimum_resize_size()
2997 old_desc_blocks = fs->desc_blocks + in calculate_minimum_resize_size()
2998 fs->super->s_reserved_gdt_blocks; in calculate_minimum_resize_size()
3001 data_needed = ext2fs_blocks_count(fs->super); in calculate_minimum_resize_size()
3002 for (grp = 0; grp < fs->group_desc_count; grp++) { in calculate_minimum_resize_size()
3003 __u32 n = ext2fs_bg_free_blocks_count(fs, grp); in calculate_minimum_resize_size()
3005 if (n > EXT2_BLOCKS_PER_GROUP(fs->super)) in calculate_minimum_resize_size()
3006 n = EXT2_BLOCKS_PER_GROUP(fs->super); in calculate_minimum_resize_size()
3007 n += calc_group_overhead(fs, grp, old_desc_blocks); in calculate_minimum_resize_size()
3011 return ext2fs_blocks_count(fs->super); in calculate_minimum_resize_size()
3017 printf("fs requires %llu data blocks.\n", in calculate_minimum_resize_size()
3027 if (ext2fs_has_feature_flex_bg(fs->super)) { in calculate_minimum_resize_size()
3031 if (flex_groups > fs->group_desc_count) in calculate_minimum_resize_size()
3032 flex_groups = fs->group_desc_count; in calculate_minimum_resize_size()
3039 data_blocks = EXT2_GROUPS_TO_BLOCKS(fs->super, groups); in calculate_minimum_resize_size()
3042 overhead = calc_group_overhead(fs, grp, old_desc_blocks); in calculate_minimum_resize_size()
3050 last_start += EXT2_BLOCKS_PER_GROUP(fs->super) - in calculate_minimum_resize_size()
3075 EXT2_BLOCKS_PER_GROUP(fs->super)); in calculate_minimum_resize_size()
3077 data_blocks += EXT2_GROUPS_TO_BLOCKS(fs->super, extra_grps); in calculate_minimum_resize_size()
3080 overhead = calc_group_overhead(fs, groups-1, old_desc_blocks); in calculate_minimum_resize_size()
3081 last_start += EXT2_BLOCKS_PER_GROUP(fs->super) - overhead; in calculate_minimum_resize_size()
3085 if (!ext2fs_has_feature_flex_bg(fs->super)) in calculate_minimum_resize_size()
3091 if (flex_groups > fs->group_desc_count) in calculate_minimum_resize_size()
3092 flex_groups = fs->group_desc_count; in calculate_minimum_resize_size()
3096 overhead = calc_group_overhead(fs, grp, in calculate_minimum_resize_size()
3104 last_start += EXT2_BLOCKS_PER_GROUP(fs->super) in calculate_minimum_resize_size()
3123 if (ext2fs_has_feature_flex_bg(fs->super) && in calculate_minimum_resize_size()
3128 overhead += calc_group_overhead(fs, grp, old_desc_blocks); in calculate_minimum_resize_size()
3150 * even worth making/resizing the fs. basically you need to in calculate_minimum_resize_size()
3161 overhead += fs->super->s_first_data_block; in calculate_minimum_resize_size()
3169 if (EXT2FS_CLUSTER_RATIO(fs) > 1) in calculate_minimum_resize_size()
3170 overhead += EXT2FS_CLUSTER_RATIO(fs) * 2; in calculate_minimum_resize_size()
3178 blks_needed = EXT2_GROUPS_TO_BLOCKS(fs->super, groups - 1); in calculate_minimum_resize_size()
3185 overhead = ext2fs_inode_table_loc(fs, groups-1) + in calculate_minimum_resize_size()
3186 fs->inode_blocks_per_group; in calculate_minimum_resize_size()
3200 if (blks_needed >= ext2fs_blocks_count(fs->super)) in calculate_minimum_resize_size()
3201 return ext2fs_blocks_count(fs->super); in calculate_minimum_resize_size()
3212 if (ext2fs_has_feature_extents(fs->super)) { in calculate_minimum_resize_size()
3213 blk64_t safe_margin = (ext2fs_blocks_count(fs->super) - in calculate_minimum_resize_size()
3215 unsigned int exts_per_blk = (fs->blocksize / in calculate_minimum_resize_size()