diff options
-rw-r--r-- | src/inode.c | 7 | ||||
-rw-r--r-- | src/lookup_local.c | 2 | ||||
-rw-r--r-- | src/recover.c | 6 |
3 files changed, 11 insertions, 4 deletions
diff --git a/src/inode.c b/src/inode.c index 9f8b393..57ca9a1 100644 --- a/src/inode.c +++ b/src/inode.c @@ -617,7 +617,8 @@ r_item* get_last_undel_inode(struct ring_buf* buf){ #ifdef DEBUG printf("UD-Inode %d\n",item->transaction.start); #endif - if(! item->inode->i_links_count) + if((! item->inode->i_links_count)&&(item->inode->i_ctime) + &&(item->inode->i_mode)) item->inode->i_links_count = 1 ; return item; } @@ -648,7 +649,7 @@ r_item* get_last_undel_inode(struct ring_buf* buf){ } // if (item->inode->i_generation != generation) // buf->reuse_flag = 1; - if(! item->inode->i_links_count) + if((! item->inode->i_links_count)&&(item->inode->i_ctime)&&(item->inode->i_mode)) item->inode->i_links_count = 1 ; #ifdef DEBUG printf("UTD-Inode %d\n",item->transaction.start); @@ -796,7 +797,7 @@ struct ring_buf* get_j_inode_list(struct ext2_super_block *es, ext2_ino_t inode_ if ( ext2fs_read_inode_full(current_fs, inode_nr, (struct ext2_inode*)inode_buf, pos.size)) goto errout; inode_pointer = (struct ext2_inode*) inode_buf ; - if(! inode_pointer->i_dtime){ + if((! inode_pointer->i_dtime) && inode_pointer->i_ctime){ item = r_item_add(buf); if ( ! item){ fprintf(stderr,"Error: can not allocate memory for inode\n"); diff --git a/src/lookup_local.c b/src/lookup_local.c index 9867090..76d9b0a 100644 --- a/src/lookup_local.c +++ b/src/lookup_local.c @@ -501,7 +501,7 @@ void list_dir2(ext2_ino_t ino, struct ext2_inode *inode) struct priv_dir_iterate_struct fl; struct dir_list_head_t * l_dir = NULL; - if(d_inode) d_inode->i_links_count = 0; //set flag for test + if(d_inode) memset(d_inode, 0 , current_fs->super->s_inode_size); i_list = (struct ring_buf*) get_j_inode_list(current_fs->super, ino); if (! i_list) return NULL; diff --git a/src/recover.c b/src/recover.c index daad216..f089a34 100644 --- a/src/recover.c +++ b/src/recover.c @@ -291,6 +291,9 @@ int recover_file( char* des_dir,char* pathname, char* filename, struct ext2_inod printf("RECOVER : INODE=%ld FILENAME=%s/%s\n",inode_nr, pathname,filename); dump_inode(stdout, "",inode_nr, (struct ext2_inode *)inode, 0); #endif + + if (!(inode->i_mode & LINUX_S_IFMT)) //no type flag - no recover + return 1; p1 = pathname; while (*p1 == '/') p1++; @@ -525,6 +528,9 @@ int check_file_recover(struct ext2_inode *inode){ int retval =-1; struct alloc_stat stat; + if (!(inode->i_mode & LINUX_S_IFMT)) // no type flag + return 0; + stat.allocated = 0; stat.not_allocated = 0; if ((! inode->i_blocks) || (LINUX_S_ISLNK(inode->i_mode) && (inode->i_size < EXT2_N_BLOCKS*4)) || |