From ec9eb54d2f36f9c98607b5fc8745f978cfebd63e Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Mon, 14 May 2018 02:40:06 +0100 Subject: support non extents and fast symlinks --- src/clone_inode.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src/clone_inode.c') diff --git a/src/clone_inode.c b/src/clone_inode.c index 33d4647..3f7a94b 100644 --- a/src/clone_inode.c +++ b/src/clone_inode.c @@ -5,7 +5,7 @@ int clone_inode (ext2_filsys src_fs, ext2_filsys dst_fs, ext2_ino_t i_num, struc struct ext2_inode dst_i; int ret; - // printf ("cloning inode %d\n", (int) i_num); + //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)); @@ -30,18 +30,31 @@ int clone_inode (ext2_filsys src_fs, ext2_filsys dst_fs, ext2_ino_t i_num, struc } } else { + /* Two possibilities here - fast links or old style block lists */ - EXT2_MOAN_FAIL (ret, ext2fs_write_inode (dst_fs, i_num, &dst_i)); + 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)); - 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; + 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 -- cgit v1.2.3