aboutsummaryrefslogtreecommitdiffstats
path: root/src/clone_inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/clone_inode.c')
-rw-r--r--src/clone_inode.c23
1 files changed, 18 insertions, 5 deletions
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