summaryrefslogtreecommitdiff
path: root/src/inode.c
diff options
context:
space:
mode:
authorrobi <robi>2011-05-15 19:11:22 +0000
committerrobi <robi>2011-05-15 19:11:22 +0000
commit7c887a9e437e5e842a1ad0450101ee99be7ed626 (patch)
tree4b5bf0731104a90be151c3e4746da6e826e344f6 /src/inode.c
parentc9ddfc8fe6e3356f3da578dae3c7b0276be32e39 (diff)
first step, magic_scan_engine ext4
Diffstat (limited to 'src/inode.c')
-rw-r--r--src/inode.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/inode.c b/src/inode.c
index ecc28a8..5ce54ad 100644
--- a/src/inode.c
+++ b/src/inode.c
@@ -891,6 +891,7 @@ struct ext2_inode_large* new_inode(){
struct ext2_inode_large *inode;
__u32 a_time;
time_t help_time;
+ struct ext3_extent_header *p_extent_header;
time( &help_time );
a_time = (__u32) help_time;
@@ -904,11 +905,96 @@ struct ext2_inode_large* new_inode(){
inode->i_links_count = 1 ;
if (current_fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS) {
inode->i_flags = EXT4_EXTENTS_FL ;
+ p_extent_header = (struct ext3_extent_header*) inode->i_block;
+ p_extent_header->eh_magic = ext2fs_cpu_to_le16(EXT3_EXT_MAGIC) ;
+ p_extent_header->eh_max = ext2fs_cpu_to_le16(4);
}
return inode;
}
+//add extent to inode
+int inode_add_extent(struct ext2_inode_large* inode , blk_t blk , void *buf, int flag) {
+ struct ext3_extent_idx *idx;
+ struct ext3_extent_header *header;
+ struct ext3_extent_header *data_header;
+ struct ext3_extent *extent;
+ unsigned long long i_size;
+ __u32 l_block,l_count,l_start,i;
+
+ header = (struct ext3_extent_header*) inode->i_block;
+ if (flag && buf){
+ data_header = (struct ext3_extent_header*) buf;
+ if (ext2fs_le32_to_cpu(header->eh_entries) >= ext2fs_le32_to_cpu(header->eh_max)){
+ fprintf(stderr," Error: can not add a extent to inode\n");
+ return 0;
+ }
+ idx = (struct ext3_extent_idx*) (header + (ext2fs_le16_to_cpu(header->eh_entries) + 1));
+
+ if (! header->eh_entries)
+ header->eh_depth = ext2fs_cpu_to_le16(ext2fs_le16_to_cpu(data_header->eh_depth) +1);
+
+ idx->ei_leaf = ext2fs_cpu_to_le32(blk);
+ idx->ei_leaf_hi = 0;
+ idx->ei_unused = 0;
+ l_count = 0;
+ extent = (struct ext3_extent*)(data_header + 1);
+ l_start = ext2fs_le32_to_cpu(extent->ee_block);
+ for (i=1; i<=ext2fs_le16_to_cpu(data_header->eh_entries); i++){
+ l_count += ext2fs_le16_to_cpu(extent->ee_len);
+ l_block = ext2fs_le32_to_cpu(extent->ee_block) + ext2fs_le16_to_cpu(extent->ee_len) ;
+ extent++;
+ }
+
+ idx->ei_block = ext2fs_cpu_to_le32(l_start);
+ header->eh_entries = ext2fs_cpu_to_le16(ext2fs_le16_to_cpu(header->eh_entries) + 1 );
+//blockhex (stdout, (void*) inode->i_block, 0, 60);
+ i_size = (unsigned long long)(inode->i_size | ((unsigned long long)inode->i_size_high << 32));
+ i_size += (l_block * current_fs->blocksize);
+ inode->i_size = i_size & 0xffffffff ;
+ inode->i_size_high = i_size >> 32 ;
+ inode->i_blocks += ((l_count + 1) * (current_fs->blocksize / 512)) ;
+blockhex (stdout, (void*) inode, 0, 128);
+ }
+
+return 1;
+}
+
+
+
+//search the last data block ext4-inode
+blk_t get_last_block_ext4(struct ext2_inode_large* inode){
+ blk_t blk;
+ struct ext3_extent_idx *idx;
+ struct ext3_extent_header *header;
+ struct ext3_extent *extent;
+ unsigned char *buf = NULL;
+
+ buf = malloc(current_fs->blocksize);
+ if (!buf) return 0;
+
+ header = (struct ext3_extent_header*) inode->i_block;
+ while (ext2fs_le16_to_cpu(header->eh_depth)){
+ idx = (struct ext3_extent_idx*) (header + (ext2fs_le16_to_cpu(header->eh_entries)));
+
+ if(io_channel_read_blk ( current_fs->io,ext2fs_le32_to_cpu(idx->ei_leaf), 1, buf )){
+ fprintf(stderr,"Error read block %lu\n",ext2fs_le32_to_cpu(idx->ei_leaf));
+ return 0;
+ }
+
+ header = (struct ext3_extent_header*) buf ;
+
+ }
+ extent = (struct ext3_extent*)(header + ext2fs_le16_to_cpu(header->eh_entries));
+
+ blk = ext2fs_le32_to_cpu(extent->ee_start) + ext2fs_le16_to_cpu(extent->ee_len);
+
+ if (buf) free(buf);
+return --blk;
+}
+
+
+
//add a block to inode
int inode_add_block(struct ext2_inode_large* inode , blk_t blk , __u32 size) {
int i = 0 ;