diff options
author | fishsoupisgood <github@madingley.org> | 2018-05-12 17:10:22 +0100 |
---|---|---|
committer | fishsoupisgood <github@madingley.org> | 2018-05-12 17:10:22 +0100 |
commit | b6afefb5d12dbed4801272dae3048588dfc1cb9a (patch) | |
tree | 0dc99b5b05d54cd5496b26fa37e19cc79f0b4b5e /src/clone_inode.c | |
download | ext_clone-b6afefb5d12dbed4801272dae3048588dfc1cb9a.tar.gz ext_clone-b6afefb5d12dbed4801272dae3048588dfc1cb9a.tar.bz2 ext_clone-b6afefb5d12dbed4801272dae3048588dfc1cb9a.zip |
first working version
Diffstat (limited to 'src/clone_inode.c')
-rw-r--r-- | src/clone_inode.c | 59 |
1 files changed, 59 insertions, 0 deletions
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; +} + + |