From: Mingming Cao Currently the ext2 preallocation is discarded on every iput() (via ext2_put_inode()). We should only discard the preallocation on the last iput() (via ext2_clear_inode()). Signed-off-by: Andrew Morton --- 25-akpm/fs/ext2/ext2.h | 1 - 25-akpm/fs/ext2/inode.c | 13 ------------- 25-akpm/fs/ext2/super.c | 10 ++++------ 3 files changed, 4 insertions(+), 20 deletions(-) diff -puN fs/ext2/ext2.h~ext2-discard-preallocation-in-last-iput fs/ext2/ext2.h --- 25/fs/ext2/ext2.h~ext2-discard-preallocation-in-last-iput 2004-10-15 23:19:27.482224336 -0700 +++ 25-akpm/fs/ext2/ext2.h 2004-10-15 23:19:27.491222968 -0700 @@ -116,7 +116,6 @@ extern unsigned long ext2_count_free (st /* inode.c */ extern void ext2_read_inode (struct inode *); extern int ext2_write_inode (struct inode *, int); -extern void ext2_put_inode (struct inode *); extern void ext2_delete_inode (struct inode *); extern int ext2_sync_inode (struct inode *); extern void ext2_discard_prealloc (struct inode *); diff -puN fs/ext2/inode.c~ext2-discard-preallocation-in-last-iput fs/ext2/inode.c --- 25/fs/ext2/inode.c~ext2-discard-preallocation-in-last-iput 2004-10-15 23:19:27.484224032 -0700 +++ 25-akpm/fs/ext2/inode.c 2004-10-15 23:19:27.490223120 -0700 @@ -53,19 +53,6 @@ static inline int ext2_inode_is_fast_sym } /* - * Called at each iput(). - * - * The inode may be "bad" if ext2_read_inode() saw an error from - * ext2_get_inode(), so we need to check that to avoid freeing random disk - * blocks. - */ -void ext2_put_inode(struct inode *inode) -{ - if (!is_bad_inode(inode)) - ext2_discard_prealloc(inode); -} - -/* * Called at the last iput() if i_nlink is zero. */ void ext2_delete_inode (struct inode * inode) diff -puN fs/ext2/super.c~ext2-discard-preallocation-in-last-iput fs/ext2/super.c --- 25/fs/ext2/super.c~ext2-discard-preallocation-in-last-iput 2004-10-15 23:19:27.485223880 -0700 +++ 25-akpm/fs/ext2/super.c 2004-10-15 23:19:27.491222968 -0700 @@ -181,10 +181,9 @@ static void destroy_inodecache(void) printk(KERN_INFO "ext2_inode_cache: not all structures were freed\n"); } -#ifdef CONFIG_EXT2_FS_POSIX_ACL - static void ext2_clear_inode(struct inode *inode) { +#ifdef CONFIG_EXT2_FS_POSIX_ACL struct ext2_inode_info *ei = EXT2_I(inode); if (ei->i_acl && ei->i_acl != EXT2_ACL_NOT_CACHED) { @@ -195,18 +194,17 @@ static void ext2_clear_inode(struct inod posix_acl_release(ei->i_default_acl); ei->i_default_acl = EXT2_ACL_NOT_CACHED; } +#endif + if (!is_bad_inode(inode)) + ext2_discard_prealloc(inode); } -#else -# define ext2_clear_inode NULL -#endif static struct super_operations ext2_sops = { .alloc_inode = ext2_alloc_inode, .destroy_inode = ext2_destroy_inode, .read_inode = ext2_read_inode, .write_inode = ext2_write_inode, - .put_inode = ext2_put_inode, .delete_inode = ext2_delete_inode, .put_super = ext2_put_super, .write_super = ext2_write_super, _