Lines Matching full:rfs
43 static errcode_t adjust_superblock(ext2_resize_t rfs, blk_t new_size);
44 static errcode_t blocks_to_move(ext2_resize_t rfs);
45 static errcode_t block_mover(ext2_resize_t rfs);
46 static errcode_t inode_scan_and_fix(ext2_resize_t rfs);
47 static errcode_t inode_ref_fix(ext2_resize_t rfs);
48 static errcode_t move_itables(ext2_resize_t rfs);
72 errcode_t (*progress)(ext2_resize_t rfs, int pass,
76 ext2_resize_t rfs;
86 retval = ext2fs_get_mem(sizeof(struct ext2_resize_struct), &rfs);
89 memset(rfs, 0, sizeof(struct ext2_resize_struct));
91 rfs->old_fs = fs;
92 rfs->flags = flags;
93 rfs->itable_buf = 0;
94 rfs->progress = progress;
95 retval = ext2fs_dup_handle(fs, &rfs->new_fs);
99 retval = adjust_superblock(rfs, *new_size);
103 *new_size = rfs->new_fs->super->s_blocks_count;
105 retval = blocks_to_move(rfs);
110 if (rfs->flags & RESIZE_DEBUG_BMOVE)
112 rfs->old_fs->super->s_free_blocks_count,
113 rfs->new_fs->super->s_free_blocks_count,
114 rfs->needed_blocks);
117 retval = block_mover(rfs);
121 retval = inode_scan_and_fix(rfs);
125 retval = inode_ref_fix(rfs);
129 retval = move_itables(rfs);
133 retval = ext2fs_calculate_summary_stats(rfs->new_fs);
137 retval = fix_resize_inode(rfs->new_fs);
141 rfs->new_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
142 retval = ext2fs_close(rfs->new_fs);
146 rfs->flags = flags;
148 ext2fs_free(rfs->old_fs);
149 if (rfs->itable_buf)
150 ext2fs_free_mem(&rfs->itable_buf);
151 ext2fs_free_mem(&rfs);
156 if (rfs->new_fs)
157 ext2fs_free(rfs->new_fs);
158 if (rfs->itable_buf)
159 ext2fs_free_mem(&rfs->itable_buf);
160 ext2fs_free_mem(&rfs);
434 static errcode_t adjust_superblock(ext2_resize_t rfs, blk_t new_size)
443 fs = rfs->new_fs;
448 retval = adjust_fs_info(fs, rfs->old_fs, new_size);
455 if ((rfs->old_fs->super->s_inodes_count -
456 rfs->old_fs->super->s_free_inodes_count) >
457 rfs->new_fs->super->s_inodes_count) {
466 if (rfs->old_fs->group_desc_count > fs->group_desc_count) {
476 if (rfs->old_fs->group_desc_count >= fs->group_desc_count) {
485 &rfs->itable_buf);
489 memset(rfs->itable_buf, 0, fs->blocksize * fs->inode_blocks_per_group);
491 rfs->old_fs->group_desc_count * fs->super->s_blocks_per_group;
493 adj = rfs->old_fs->group_desc_count;
495 if (rfs->progress) {
496 retval = rfs->progress(rfs, E2_RSZ_EXTEND_ITABLE_PASS,
501 for (i = rfs->old_fs->group_desc_count;
509 rfs->itable_buf);
513 if (rfs->progress) {
514 retval = rfs->progress(rfs, E2_RSZ_EXTEND_ITABLE_PASS,
590 static void mark_fs_metablock(ext2_resize_t rfs,
594 ext2_filsys fs = rfs->new_fs;
596 ext2fs_mark_block_bitmap(rfs->reserve_blocks, blk);
606 rfs->needed_blocks++;
609 rfs->needed_blocks++;
612 rfs->needed_blocks++;
613 } else if (ext2fs_test_block_bitmap(rfs->old_fs->block_map, blk) &&
615 ext2fs_mark_block_bitmap(rfs->move_blocks, blk);
616 rfs->needed_blocks++;
626 static errcode_t blocks_to_move(ext2_resize_t rfs)
637 fs = rfs->new_fs;
638 old_fs = rfs->old_fs;
640 fs = rfs->old_fs;
643 &rfs->reserve_blocks);
648 &rfs->move_blocks);
661 fs = rfs->new_fs;
671 ext2fs_mark_block_bitmap(rfs->move_blocks, blk);
672 rfs->needed_blocks++;
674 ext2fs_mark_block_bitmap(rfs->reserve_blocks, blk);
709 rfs->needed_blocks--;
724 mark_fs_metablock(rfs, meta_bmap, i, group_blk);
733 mark_fs_metablock(rfs, meta_bmap,
742 mark_fs_metablock(rfs, meta_bmap, i,
756 ext2fs_mark_block_bitmap(rfs->reserve_blocks,
759 ext2fs_mark_block_bitmap(rfs->reserve_blocks,
764 ext2fs_mark_block_bitmap(rfs->reserve_blocks,
771 rfs->reserve_blocks);
784 ext2fs_mark_block_bitmap(rfs->move_blocks,
792 ext2fs_mark_block_bitmap(rfs->move_blocks,
806 rfs->needed_blocks += fs->inode_blocks_per_group;
818 ext2fs_mark_block_bitmap(rfs->move_blocks,
826 for (blk = rfs->old_fs->group_desc[i].bg_inode_table, j=0;
828 ext2fs_mark_block_bitmap(rfs->reserve_blocks, blk);
831 group_blk += rfs->new_fs->super->s_blocks_per_group;
859 static void init_block_alloc(ext2_resize_t rfs)
861 rfs->alloc_state = AVOID_OLD;
862 rfs->new_blk = rfs->new_fs->super->s_first_data_block;
865 if (rfs->new_fs->super->s_blocks_count >
866 rfs->old_fs->super->s_blocks_count)
867 rfs->new_blk = rfs->old_fs->super->s_blocks_count;
871 static blk_t get_new_block(ext2_resize_t rfs)
873 ext2_filsys fs = rfs->new_fs;
876 if (rfs->new_blk >= fs->super->s_blocks_count) {
877 if (rfs->alloc_state == DESPERATION)
881 if (rfs->flags & RESIZE_DEBUG_BMOVE)
885 rfs->alloc_state = DESPERATION;
886 rfs->new_blk = fs->super->s_first_data_block;
889 if (ext2fs_test_block_bitmap(fs->block_map, rfs->new_blk) ||
890 ext2fs_test_block_bitmap(rfs->reserve_blocks,
891 rfs->new_blk) ||
892 ((rfs->alloc_state == AVOID_OLD) &&
893 (rfs->new_blk < rfs->old_fs->super->s_blocks_count) &&
894 ext2fs_test_block_bitmap(rfs->old_fs->block_map,
895 rfs->new_blk))) {
896 rfs->new_blk++;
899 return rfs->new_blk;
903 static errcode_t block_mover(ext2_resize_t rfs)
906 ext2_filsys fs = rfs->new_fs;
907 ext2_filsys old_fs = rfs->old_fs;
919 if (!rfs->itable_buf) {
922 &rfs->itable_buf);
926 retval = ext2fs_create_extent_table(&rfs->bmap, 0);
935 init_block_alloc(rfs);
940 if (!ext2fs_test_block_bitmap(rfs->move_blocks, blk))
948 new_blk = get_new_block(rfs);
954 ext2fs_add_extent_entry(rfs->bmap, blk, new_blk);
959 if (rfs->bmap) {
960 ext2fs_free_extent_table(rfs->bmap);
961 rfs->bmap = 0;
970 retval = ext2fs_iterate_extent(rfs->bmap, 0, 0, 0);
973 if (rfs->progress) {
974 retval = (rfs->progress)(rfs, E2_RSZ_BLOCK_RELOC_PASS,
980 retval = ext2fs_iterate_extent(rfs->bmap, &old_blk, &new_blk, &size);
985 if (rfs->flags & RESIZE_DEBUG_BMOVE)
994 rfs->itable_buf);
997 rfs->itable_buf);
1003 if (rfs->progress) {
1005 retval = (rfs->progress)(rfs,
1035 ext2_resize_t rfs;
1055 if (pb->rfs->bmap) {
1056 new_block = ext2fs_extent_translate(pb->rfs->bmap, block);
1062 if (pb->rfs->flags & RESIZE_DEBUG_BMOVE)
1087 ext2_resize_t rfs = (ext2_resize_t) priv_data;
1097 if (rfs->progress) {
1099 retval = (rfs->progress)(rfs, E2_RSZ_INODE_SCAN_PASS,
1108 static errcode_t inode_scan_and_fix(ext2_resize_t rfs)
1121 if ((rfs->old_fs->group_desc_count <=
1122 rfs->new_fs->group_desc_count) &&
1123 !rfs->bmap)
1132 orig_size = rfs->old_fs->super->s_blocks_count;
1133 if (orig_size < rfs->new_fs->super->s_blocks_count)
1134 rfs->old_fs->super->s_blocks_count =
1135 rfs->new_fs->super->s_blocks_count;
1137 retval = ext2fs_open_inode_scan(rfs->old_fs, 0, &scan);
1140 retval = ext2fs_init_dblist(rfs->old_fs, 0);
1142 retval = ext2fs_get_array(rfs->old_fs->blocksize, 3, &block_buf);
1145 start_to_move = (rfs->new_fs->group_desc_count *
1146 rfs->new_fs->super->s_inodes_per_group);
1148 if (rfs->progress) {
1149 retval = (rfs->progress)(rfs, E2_RSZ_INODE_SCAN_PASS,
1150 0, rfs->old_fs->group_desc_count);
1154 ext2fs_set_inode_callback(scan, progress_callback, (void *) rfs);
1155 pb.rfs = rfs;
1158 new_inode = EXT2_FIRST_INODE(rfs->new_fs->super);
1159 inode_size = EXT2_INODE_SIZE(rfs->new_fs->super);
1181 if (inode->i_file_acl && rfs->bmap) {
1182 new_block = ext2fs_extent_translate(rfs->bmap,
1186 retval = ext2fs_write_inode_full(rfs->old_fs,
1193 (rfs->bmap || pb.is_dir)) {
1195 retval = ext2fs_block_iterate2(rfs->old_fs,
1213 if (!ext2fs_test_inode_bitmap(rfs->new_fs->inode_map,
1217 if (new_inode > rfs->new_fs->super->s_inodes_count) {
1222 ext2fs_mark_inode_bitmap(rfs->new_fs->inode_map, new_inode);
1225 retval = ext2fs_read_inode_full(rfs->old_fs, ino,
1230 retval = ext2fs_write_inode_full(rfs->old_fs, new_inode,
1234 group = (new_inode-1) / EXT2_INODES_PER_GROUP(rfs->new_fs->super);
1236 rfs->new_fs->group_desc[group].bg_used_dirs_count++;
1239 if (rfs->flags & RESIZE_DEBUG_INODEMAP)
1242 if (!rfs->imap) {
1243 retval = ext2fs_create_extent_table(&rfs->imap, 0);
1247 ext2fs_add_extent_entry(rfs->imap, ino, new_inode);
1249 io_channel_flush(rfs->old_fs->io);
1252 rfs->old_fs->super->s_blocks_count = orig_size;
1253 if (rfs->bmap) {
1254 ext2fs_free_extent_table(rfs->bmap);
1255 rfs->bmap = 0;
1274 ext2_resize_t rfs;
1292 if (is->rfs->progress && offset == 0) {
1293 io_channel_flush(is->rfs->old_fs->io);
1294 is->err = (is->rfs->progress)(is->rfs,
1304 new_inode = ext2fs_extent_translate(is->rfs->imap, dirent->inode);
1309 if (is->rfs->flags & RESIZE_DEBUG_INODEMAP)
1318 retval = ext2fs_read_inode(is->rfs->old_fs, dir, &inode);
1321 is->err = ext2fs_write_inode(is->rfs->old_fs, dir, &inode);
1329 static errcode_t inode_ref_fix(ext2_resize_t rfs)
1334 if (!rfs->imap)
1342 is.max_dirs = ext2fs_dblist_count(rfs->old_fs->dblist);
1343 is.rfs = rfs;
1346 if (rfs->progress) {
1347 retval = (rfs->progress)(rfs, E2_RSZ_INODE_REF_UPD_PASS,
1353 retval = ext2fs_dblist_dir_iterate(rfs->old_fs->dblist,
1364 ext2fs_free_extent_table(rfs->imap);
1365 rfs->imap = 0;
1387 * After this you have to use the rfs->new_fs file handle to read and
1390 static errcode_t move_itables(ext2_resize_t rfs)
1394 ext2_filsys fs = rfs->new_fs;
1401 if (max_groups > rfs->old_fs->group_desc_count)
1402 max_groups = rfs->old_fs->group_desc_count;
1405 if (!rfs->itable_buf) {
1406 retval = ext2fs_get_mem(size, &rfs->itable_buf);
1416 if (rfs->old_fs->group_desc[i].bg_inode_table !=
1423 if (rfs->progress) {
1424 retval = rfs->progress(rfs, E2_RSZ_MOVE_ITABLE_PASS,
1430 rfs->old_fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
1433 old_blk = rfs->old_fs->group_desc[i].bg_inode_table;
1438 if (rfs->flags & RESIZE_DEBUG_ITABLEMOVE)
1448 rfs->itable_buf);
1458 for (cp = rfs->itable_buf+size-1, n=0; n < size; n++, cp--)
1463 if (rfs->flags & RESIZE_DEBUG_ITABLEMOVE)
1471 num, rfs->itable_buf);
1474 num, rfs->itable_buf);
1480 diff, (rfs->itable_buf +
1487 for (blk = rfs->old_fs->group_desc[i].bg_inode_table, j=0;
1491 rfs->old_fs->group_desc[i].bg_inode_table = new_blk;
1492 ext2fs_mark_super_dirty(rfs->old_fs);
1493 ext2fs_flush(rfs->old_fs);
1495 if (rfs->progress) {
1496 retval = rfs->progress(rfs, E2_RSZ_MOVE_ITABLE_PASS,
1505 if (rfs->flags & RESIZE_DEBUG_ITABLEMOVE)