From: Mingming Cao <cmm@us.ibm.com>

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 <akpm@osdl.org>
---

 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,
_