diff options
author | robi <robi> | 2010-09-16 17:22:29 +0000 |
---|---|---|
committer | robi <robi> | 2010-09-16 17:22:29 +0000 |
commit | d90aa9c825e6c2dda92c65238afc782c99f9f0b2 (patch) | |
tree | 0f81ad6d93e26446afbf38f39d13baebf44cdb94 /src/inode.c | |
parent | 6512ac6340cc34ed778505293943b664e4ec1b4c (diff) |
magic functions part3 (inactiv)
Diffstat (limited to 'src/inode.c')
-rw-r--r-- | src/inode.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/inode.c b/src/inode.c index d25e9ad..87c07ba 100644 --- a/src/inode.c +++ b/src/inode.c @@ -22,6 +22,7 @@ #include <stdlib.h> #include <ctype.h> #include <string.h> +#include <time.h> #ifdef HAVE_ERRNO_H #include <errno.h> @@ -892,3 +893,109 @@ int read_journal_inode( ext2_ino_t inode_nr, struct ext2_inode* inode_buf, __u32 } return retval; } + + + + +struct ext2_inode_large* new_inode(){ + struct ext2_inode_large *inode; + __u32 a_time; + time_t help_time; + + time( &help_time ); + a_time = (__u32) help_time; + inode = malloc(EXT2_INODE_SIZE(current_fs->super)); + if (! inode ) + return NULL; + + memset(inode, 0 , EXT2_INODE_SIZE(current_fs->super)); + inode->i_mode = LINUX_S_IFREG | LINUX_S_IRUSR | LINUX_S_IWUSR | LINUX_S_IRGRP | LINUX_S_IROTH ; + inode->i_ctime = inode->i_mtime = inode->i_atime = a_time; + inode->i_links_count = 1 ; + if (current_fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS) { + inode->i_flags = EXT4_EXTENTS_FL ; + } +return inode; +} + + + +int inode_add_block(struct ext2_inode_large* inode , blk_t blk , __u32 size) { + int i = 0 ; + unsigned long long i_size; + + if (! (inode->i_flags & EXT4_EXTENTS_FL)){ + //ext3 + while ((i < EXT2_N_BLOCKS) && inode->i_block[i] ) + i++; + if ( i >= EXT2_NDIR_BLOCKS){ +// printf("faulty Block %u as i_block %d \n", i,blk); + //indirect blocks + return 0; + } + + inode->i_block[i] = blk; + i_size = (unsigned long long)(inode->i_size | ((unsigned long long)inode->i_size_high << 32)); + i_size += size; + inode->i_size = i_size & 0xffffffff ; + inode->i_size_high = i_size >> 32 ; + inode->i_blocks += (current_fs->blocksize / 512); + } + else{ +// printf("ERROR: ext3 block %u : but is a ext4_inode\n", blk); + //FIXME ext4 + } +return 1; +} + + + +blk_t inode_add_meta_block(struct ext2_inode_large* inode , blk_t blk, blk_t *last, char *buf ){ + blk_t b_blk,block_count, next; + blk_t count=0; + int i; + unsigned long long i_size = 0; + + i = 0; + block_count = 0; + next = 0; + if (! (inode->i_flags & EXT4_EXTENTS_FL)){ + + while ((i < EXT2_N_BLOCKS) && inode->i_block[i] ) + i++; + + switch (i){ + case EXT2_IND_BLOCK : + i_size = get_ind_block_len(buf, &block_count, last, &next); + break; + case EXT2_DIND_BLOCK : + i_size = get_dind_block_len(buf, &block_count, last, &next); + break; + case EXT2_TIND_BLOCK : + i_size = get_tind_block_len(buf, &block_count, last, &next); + break; + default: +// printf("faulty Block %u as indirekter_block %d \n", i,blk); + return 0; + break; + } + + if (i_size){ + i_size += (((unsigned long long)inode->i_size_high << 32)| inode->i_size); + inode->i_size = i_size & 0xffffffff ; + inode->i_size_high = i_size >> 32 ; + inode->i_blocks += (block_count * (current_fs->blocksize / 512)); + inode->i_block[ i ] = blk; + } + else + next = 0; + + return next; + } + else{ +// printf("ERROR: ext3 indirect block %u ; but is a ext4_inode\n", blk); + //FIXME ext4 + } + + return 1; +}
\ No newline at end of file |