Lines Matching refs:fs

183 static int doblock(struct ext2_fs *fs,
213 static int doindblock(struct ext2_fs *fs,
223 if (!doblock(fs, state, blk, refblock, refoffset, 1))
226 bh = ext2_bread(fs, blk);
231 for (i=0;i<(fs->blocksize >> 2);i++)
233 if (!doblock(fs, state, PED_LE32_TO_CPU(uptr[i]), blk,
243 static int dodindblock(struct ext2_fs *fs,
253 if (!doblock(fs, state, blk, refblock, refoffset, 2))
256 bh = ext2_bread(fs, blk);
261 for (i=0;i<(fs->blocksize >> 2);i++)
263 if (!doindblock(fs, state, PED_LE32_TO_CPU(uptr[i]),
273 static int dotindblock(struct ext2_fs *fs,
283 if (!doblock(fs, state, blk, refblock, refoffset, 3))
286 bh = ext2_bread(fs, blk);
291 for (i=0;i<(fs->blocksize >> 2);i++)
293 if (!dodindblock(fs, state, PED_LE32_TO_CPU(uptr[i]),
307 static int doinode(struct ext2_fs *fs, struct ext2_block_relocator_state *state, int inode)
311 if (!ext2_read_inode(fs, inode, &buf))
321 inodeoffset = ext2_get_inode_offset(fs, inode, &inodeblock);
324 if (EXT2_SUPER_CREATOR_OS(fs->sb) == EXT2_OS_HURD
326 if (!doblock(fs,
338 if (!doblock(fs,
347 if (!doindblock(fs,
355 if (!dodindblock(fs,
363 if (!dotindblock(fs,
378 static int doscan(struct ext2_fs *fs, struct ext2_block_relocator_state *state)
387 for (i=0;i<fs->numgroups;i++)
393 if (fs->opt_verbose)
399 bh = ext2_bread(fs, EXT2_GROUP_INODE_BITMAP(fs->gd[i]));
402 offset = i * EXT2_SUPER_INODES_PER_GROUP(fs->sb) + 1;
404 for (j=0;j<EXT2_SUPER_INODES_PER_GROUP(fs->sb);j++)
407 if (!doinode(fs, state, offset + j))
419 if (fs->opt_verbose)
431 if (fs->opt_verbose)
446 static int ext2_block_relocator_copy(struct ext2_fs *fs, struct ext2_block_relocator_state *state)
451 buf = (unsigned char *) ped_malloc(MAXCONT << fs->logsize);
474 if (!ext2_bcache_flush_range(fs, ptr[0].num, num))
476 if (!ext2_bcache_flush_range(fs, ptr[0].dest, num))
479 if (!ext2_read_blocks(fs, buf, ptr[0].num, num))
481 if (!ext2_write_blocks(fs, buf, ptr[0].dest, num))
487 if (fs->opt_verbose)
498 if (fs->opt_safe)
499 ext2_sync(fs);
501 if (fs->opt_verbose)
516 if (!ext2_copy_block(fs, block->num, block->dest))
529 static int ext2_block_relocator_ref(struct ext2_fs *fs, struct ext2_block_relocator_state *state, struct ext2_block_entry *block)
542 bh = ext2_bread(fs, block->refblock);
546 if (fs->opt_debug)
571 ext2_set_block_state(fs, block->dest, 1, 1);
572 ext2_set_block_state(fs, block->num, 0, 1);
599 static int ext2_block_relocator_grab_blocks(struct ext2_fs *fs, struct ext2_block_relocator_state *state)
606 for (i=0;i<fs->numgroups;i++)
607 if (EXT2_GROUP_FREE_BLOCKS_COUNT(fs->gd[i]))
613 bh = ext2_bread(fs, EXT2_GROUP_BLOCK_BITMAP(fs->gd[i]));
614 offset = i * EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb)
615 + EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb);
618 j<EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb);
637 static int ext2_block_relocator_flush(struct ext2_fs *fs, struct ext2_block_relocator_state *state)
644 if (fs->opt_verbose)
647 if (fs->opt_debug)
665 if (!doscan(fs, state))
668 if (!ext2_block_relocator_grab_blocks(fs, state))
671 if (!ext2_block_relocator_copy(fs, state))
691 if (fs->opt_verbose)
709 if (!ext2_block_relocator_ref(fs, state, &dst[j]))
712 if (fs->opt_safe) {
713 if (!ext2_sync(fs))
717 if (fs->opt_verbose)
727 static int ext2_block_relocator_mark(struct ext2_fs *fs, struct ext2_block_relocator_state *state, blk_t block)
731 if (fs->opt_debug)
733 if (!ext2_get_block_state(fs, block) ||
734 !ext2_is_data_block(fs, block))
740 ext2_get_block_state(fs, block),
741 ext2_is_data_block(fs, block));
746 if (!ext2_block_relocator_flush(fs, state))
759 static int ext2_block_relocate_grow(struct ext2_fs *fs, struct ext2_block_relocator_state *state, blk_t newsize)
766 - EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb),
767 EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb));
770 fs->blocksize);
771 if (newgdblocks == fs->gdblocks)
775 state->newallocoffset = newitoffset + fs->inodeblocks;
777 for (i=0;i<fs->numgroups;i++)
785 bh = ext2_bread(fs, EXT2_GROUP_BLOCK_BITMAP(fs->gd[i]));
786 start = (i * EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb))
787 + EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb);
788 sparse = ext2_is_group_sparse(fs, i);
790 if (EXT2_GROUP_INODE_TABLE(fs->gd[i]) < start + newitoffset
791 || (sparse && ((EXT2_GROUP_BLOCK_BITMAP(fs->gd[i])
793 || (EXT2_GROUP_INODE_BITMAP(fs->gd[i])
796 diff = newitoffset - (EXT2_GROUP_INODE_TABLE(fs->gd[i])
804 k = EXT2_GROUP_INODE_TABLE(fs->gd[i])
805 + fs->inodeblocks + j;
806 block = k % EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb);
808 k += EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb);
809 if (!ext2_block_relocator_mark(fs,
822 if (!ext2_block_relocator_flush(fs, state))
828 static int ext2_block_relocate_shrink(struct ext2_fs *fs, struct ext2_block_relocator_state *state, blk_t newsize)
832 state->newallocoffset = fs->itoffset + fs->inodeblocks;
834 for (i=0;i<fs->numgroups;i++)
844 offset = i * EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb)
845 + EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb);
846 sparse = ext2_is_group_sparse(fs, i);
848 if (newsize >= offset + EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb))
851 bh = ext2_bread(fs, EXT2_GROUP_BLOCK_BITMAP(fs->gd[i]));
860 for (j=EXT2_GROUP_INODE_BITMAP(fs->gd[i])+1;
861 j<EXT2_GROUP_INODE_TABLE(fs->gd[i]);
868 if (!ext2_block_relocator_mark(fs, state, j))
878 start = EXT2_GROUP_INODE_TABLE(fs->gd[i])
879 + fs->inodeblocks;
883 groupsize = EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb);
884 if (offset + groupsize > EXT2_SUPER_BLOCKS_COUNT(fs->sb))
885 groupsize = EXT2_SUPER_BLOCKS_COUNT(fs->sb) - offset;
889 if (!ext2_block_relocator_mark(fs, state,
899 return ext2_block_relocator_flush(fs, state);
902 int ext2_block_relocate(struct ext2_fs *fs, blk_t newsize)
906 if (fs->opt_verbose)
914 state.block = (struct ext2_block_entry *)fs->relocator_pool;
916 if (newsize < EXT2_SUPER_BLOCKS_COUNT(fs->sb))
917 return ext2_block_relocate_shrink(fs, &state, newsize);
919 return ext2_block_relocate_grow(fs, &state, newsize);