summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/inode.c7
-rw-r--r--src/lookup_local.c2
-rw-r--r--src/recover.c6
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)) ||