#include "project.h" int clone_fs (ext2_filsys src_fs, ext2_filsys dst_fs) { int skip; int ret; ext2_inode_scan scan; ext2_ino_t i_num; struct ext2_inode src_i; EXT2_MOAN_FAIL (ret, ext2fs_open_inode_scan (src_fs, 0, &scan)); if (ret) return -1; #if 0 EXT2_MOAN_FAIL (ret, ext2fs_inode_scan_flags (scan, EXT2_SF_SKIP_MISSING_ITABLE, 0)); if (ret) return -1; #endif for (;;) { EXT2_MOAN_FAIL (ret, ext2fs_get_next_inode (scan, &i_num, &src_i)); if (ret) break; if (!i_num) break; skip = 0; switch (i_num) { case EXT2_BAD_INO: case EXT4_USR_QUOTA_INO: case EXT4_GRP_QUOTA_INO: case EXT2_BOOT_LOADER_INO: case EXT2_UNDEL_DIR_INO: case EXT2_RESIZE_INO: case EXT2_EXCLUDE_INO: case EXT4_REPLICA_INO: skip = 1; } if (i_num == src_fs->super->s_journal_inum) skip = 1; // if (ext2fs_test_inode_bitmap2(src_fs->inode_map,i_num)) skip=1; if (skip) continue; ret = clone_inode (src_fs, dst_fs, i_num, &src_i); if (ret) { fprintf (stderr, "clone_inode(%d) failed\n", (int) i_num); break; } } ext2fs_close_inode_scan (scan); return ret; }