From b6afefb5d12dbed4801272dae3048588dfc1cb9a Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Sat, 12 May 2018 17:10:22 +0100 Subject: first working version --- src/clone_inode.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/clone_inode.c (limited to 'src/clone_inode.c') diff --git a/src/clone_inode.c b/src/clone_inode.c new file mode 100644 index 0000000..33d4647 --- /dev/null +++ b/src/clone_inode.c @@ -0,0 +1,59 @@ +#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\n", (int) 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 { + + EXT2_MOAN_FAIL (ret, ext2fs_write_inode (dst_fs, i_num, &dst_i)); + + if (clone_data (src_fs, dst_fs, i_num, src_i, &dst_i, 0, 0)) { + fprintf (stderr, "Cloning data 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; +} + + -- cgit v1.2.3