--- inode.c.orig 2007-12-18 20:16:09.000000000 +0800 +++ inode.c 2008-01-29 10:06:20.000000000 +0800 @@ -182,6 +182,7 @@ void ext3_delete_inode (struct inode * inode) { handle_t *handle; + __le32 i_size; truncate_inode_pages(&inode->i_data, 0); @@ -201,9 +202,11 @@ if (IS_SYNC(inode)) handle->h_sync = 1; + i_size = inode->i_size; inode->i_size = 0; if (inode->i_blocks) ext3_truncate(inode); + inode->i_size = i_size; /* * Kill off the orphan record which ext3_truncate created. * AKPM: I think this can be inside the above `if'. @@ -1984,7 +1987,7 @@ if (nr) { struct buffer_head *bh; - *p = 0; + /* *p = 0; comment for recovering */ bh = sb_find_get_block(inode->i_sb, nr); ext3_forget(handle, 0, inode, bh, nr); } @@ -2173,7 +2176,7 @@ BUFFER_TRACE(parent_bh, "get_write_access"); if (!ext3_journal_get_write_access(handle, parent_bh)){ - *p = 0; + /* *p = 0; comment for recovering */ BUFFER_TRACE(parent_bh, "call ext3_journal_dirty_metadata"); ext3_journal_dirty_metadata(handle, @@ -2344,19 +2347,19 @@ nr = i_data[EXT3_IND_BLOCK]; if (nr) { ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 1); - i_data[EXT3_IND_BLOCK] = 0; + /* i_data[EXT3_IND_BLOCK] = 0; comment for recovering */ } case EXT3_IND_BLOCK: nr = i_data[EXT3_DIND_BLOCK]; if (nr) { ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 2); - i_data[EXT3_DIND_BLOCK] = 0; + /* i_data[EXT3_DIND_BLOCK] = 0; comment for recovering */ } case EXT3_DIND_BLOCK: nr = i_data[EXT3_TIND_BLOCK]; if (nr) { ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 3); - i_data[EXT3_TIND_BLOCK] = 0; + /* i_data[EXT3_TIND_BLOCK] = 0; comment for recovering */ } case EXT3_TIND_BLOCK: ;