#include "project.h" int clone_inode (ext2_filsys src_fs, ext2_filsys dst_fs, ext2_ino_t i_num, struct ext2_inode *src_i) { struct ext2_inode dst_i; int ret; //printf ("cloning inode %d %d\n", (int) i_num, ext2fs_test_inode_bitmap2(src_fs->inode_map, i_num)); EXT2_MOAN_FAIL (ret, ext2fs_read_inode (dst_fs, i_num, &dst_i)); memcpy (&dst_i, src_i, sizeof (*src_i)); dst_i.i_blocks = 0; memset (&dst_i.i_block, 0, sizeof (dst_i.i_block)); dst_i.i_file_acl = 0; dst_i.osd2.linux2.l_i_blocks_hi = 0; dst_i.osd2.linux2.l_i_file_acl_high = 0; if (src_i->i_file_acl) if (clone_ea (src_fs, dst_fs, i_num, src_i, &dst_i)) return -1; if (src_i->i_flags & EXT4_EXTENTS_FL) { if (clone_extents (src_fs, dst_fs, i_num, src_i, &dst_i)) { fprintf (stderr, "Cloning extents for inode %d failed\n", (int) i_num); return -1; } } else { /* Two possibilities here - fast links or old style block lists */ if (!ext2fs_inode_has_valid_blocks2 (src_fs, src_i)) { /*inline -symlink*/ memcpy (&dst_i.i_block, src_i->i_block, sizeof (dst_i.i_block)); EXT2_MOAN_FAIL (ret, ext2fs_write_inode (dst_fs, i_num, &dst_i)); if (ret) return -1; } else { /*Block list*/ if (clone_blocks (src_fs, dst_fs, i_num, src_i, &dst_i)) { fprintf (stderr, "Cloning blocks for inode %d failed\n", (int) i_num); return -1; } } } if (ret) return -1; if (dst_i.i_mode & LINUX_S_IFDIR) ext2fs_inode_alloc_stats2 (dst_fs, i_num, +1, +1); else ext2fs_inode_alloc_stats2 (dst_fs, i_num, +1, 0); if (ret) return -1; stats_inodes++; stats (0); return 0; }