From: Andrew Morton <akpm@osdl.org>

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 fs/affs/inode.c         |    1 -
 fs/bfs/inode.c          |    2 --
 fs/ext2/inode.c         |    2 --
 fs/ext3/inode.c         |    2 --
 fs/fat/inode.c          |    2 --
 fs/hostfs/hostfs_kern.c |    1 -
 fs/hpfs/inode.c         |    1 -
 fs/inode.c              |   12 +++++-------
 fs/jffs/inode-v23.c     |    1 -
 fs/jfs/inode.c          |    2 --
 fs/minix/inode.c        |    1 -
 fs/ncpfs/inode.c        |    2 --
 fs/nfs/inode.c          |    2 --
 fs/proc/inode.c         |    2 --
 fs/qnx4/inode.c         |    1 -
 fs/reiserfs/inode.c     |    2 --
 fs/smbfs/inode.c        |    1 -
 fs/sysv/inode.c         |    1 -
 fs/udf/inode.c          |    2 --
 fs/ufs/inode.c          |    1 -
 mm/shmem.c              |    1 -
 21 files changed, 5 insertions(+), 37 deletions(-)

diff -puN fs/inode.c~ocfs2-prep fs/inode.c
--- devel/fs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -1034,21 +1034,19 @@ void generic_delete_inode(struct inode *
 	inodes_stat.nr_inodes--;
 	spin_unlock(&inode_lock);
 
+	if (inode->i_data.nrpages)
+		truncate_inode_pages(&inode->i_data, 0);
+
 	security_inode_delete(inode);
 
 	if (op->delete_inode) {
 		void (*delete)(struct inode *) = op->delete_inode;
 		if (!is_bad_inode(inode))
 			DQUOT_INIT(inode);
-		/* Filesystems implementing their own
-		 * s_op->delete_inode are required to call
-		 * truncate_inode_pages and clear_inode()
-		 * internally */
+		/* s_op->delete_inode internally recalls clear_inode() */
 		delete(inode);
-	} else {
-		truncate_inode_pages(&inode->i_data, 0);
+	} else
 		clear_inode(inode);
-	}
 	spin_lock(&inode_lock);
 	hlist_del_init(&inode->i_hash);
 	spin_unlock(&inode_lock);
diff -puN fs/affs/inode.c~ocfs2-prep fs/affs/inode.c
--- devel/fs/affs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/affs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -255,7 +255,6 @@ void
 affs_delete_inode(struct inode *inode)
 {
 	pr_debug("AFFS: delete_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
-	truncate_inode_pages(&inode->i_data, 0);
 	inode->i_size = 0;
 	if (S_ISREG(inode->i_mode))
 		affs_truncate(inode);
diff -puN fs/bfs/inode.c~ocfs2-prep fs/bfs/inode.c
--- devel/fs/bfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/bfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -143,8 +143,6 @@ static void bfs_delete_inode(struct inod
 
 	dprintf("ino=%08lx\n", inode->i_ino);
 
-	truncate_inode_pages(&inode->i_data, 0);
-
 	if (inode->i_ino < BFS_ROOT_INO || inode->i_ino > info->si_lasti) {
 		printf("invalid ino=%08lx\n", inode->i_ino);
 		return;
diff -puN fs/ext2/inode.c~ocfs2-prep fs/ext2/inode.c
--- devel/fs/ext2/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/ext2/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -71,8 +71,6 @@ void ext2_put_inode(struct inode *inode)
  */
 void ext2_delete_inode (struct inode * inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
-
 	if (is_bad_inode(inode))
 		goto no_delete;
 	EXT2_I(inode)->i_dtime	= get_seconds();
diff -puN fs/ext3/inode.c~ocfs2-prep fs/ext3/inode.c
--- devel/fs/ext3/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/ext3/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -187,8 +187,6 @@ void ext3_delete_inode (struct inode * i
 {
 	handle_t *handle;
 
-	truncate_inode_pages(&inode->i_data, 0);
-
 	if (is_bad_inode(inode))
 		goto no_delete;
 
diff -puN fs/fat/inode.c~ocfs2-prep fs/fat/inode.c
--- devel/fs/fat/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/fat/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -335,8 +335,6 @@ EXPORT_SYMBOL(fat_build_inode);
 
 static void fat_delete_inode(struct inode *inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
-
 	if (!is_bad_inode(inode)) {
 		inode->i_size = 0;
 		fat_truncate(inode);
diff -puN fs/hostfs/hostfs_kern.c~ocfs2-prep fs/hostfs/hostfs_kern.c
--- devel/fs/hostfs/hostfs_kern.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/hostfs/hostfs_kern.c	2005-08-30 17:01:18.000000000 -0700
@@ -284,7 +284,6 @@ static struct inode *hostfs_alloc_inode(
 
 static void hostfs_delete_inode(struct inode *inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
 	if(HOSTFS_I(inode)->fd != -1) {
 		close_file(&HOSTFS_I(inode)->fd);
 		HOSTFS_I(inode)->fd = -1;
diff -puN fs/hpfs/inode.c~ocfs2-prep fs/hpfs/inode.c
--- devel/fs/hpfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/hpfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -284,7 +284,6 @@ void hpfs_write_if_changed(struct inode 
 
 void hpfs_delete_inode(struct inode *inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
 	lock_kernel();
 	hpfs_remove_fnode(inode->i_sb, inode->i_ino);
 	unlock_kernel();
diff -puN fs/jffs/inode-v23.c~ocfs2-prep fs/jffs/inode-v23.c
--- devel/fs/jffs/inode-v23.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/jffs/inode-v23.c	2005-08-30 17:01:18.000000000 -0700
@@ -1747,7 +1747,6 @@ jffs_delete_inode(struct inode *inode)
 	D3(printk("jffs_delete_inode(): inode->i_ino == %lu\n",
 		  inode->i_ino));
 
-	truncate_inode_pages(&inode->i_data, 0);
 	lock_kernel();
 	inode->i_size = 0;
 	inode->i_blocks = 0;
diff -puN fs/jfs/inode.c~ocfs2-prep fs/jfs/inode.c
--- devel/fs/jfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/jfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -131,8 +131,6 @@ void jfs_delete_inode(struct inode *inod
 	if (!is_bad_inode(inode) &&
 	    (JFS_IP(inode)->fileset == cpu_to_le32(FILESYSTEM_I))) {
 
-		truncate_inode_pages(&inode->i_data, 0);
-
 		if (test_cflag(COMMIT_Freewmap, inode))
 			jfs_free_zero_link(inode);
 
diff -puN fs/minix/inode.c~ocfs2-prep fs/minix/inode.c
--- devel/fs/minix/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/minix/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -24,7 +24,6 @@ static int minix_remount (struct super_b
 
 static void minix_delete_inode(struct inode *inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
 	inode->i_size = 0;
 	minix_truncate(inode);
 	minix_free_inode(inode);
diff -puN fs/ncpfs/inode.c~ocfs2-prep fs/ncpfs/inode.c
--- devel/fs/ncpfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/ncpfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -286,8 +286,6 @@ ncp_iget(struct super_block *sb, struct 
 static void
 ncp_delete_inode(struct inode *inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
-
 	if (S_ISDIR(inode->i_mode)) {
 		DDPRINTK("ncp_delete_inode: put directory %ld\n", inode->i_ino);
 	}
diff -puN fs/nfs/inode.c~ocfs2-prep fs/nfs/inode.c
--- devel/fs/nfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/nfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -146,8 +146,6 @@ nfs_delete_inode(struct inode * inode)
 {
 	dprintk("NFS: delete_inode(%s/%ld)\n", inode->i_sb->s_id, inode->i_ino);
 
-	truncate_inode_pages(&inode->i_data, 0);
-
 	nfs_wb_all(inode);
 	/*
 	 * The following should never happen...
diff -puN fs/proc/inode.c~ocfs2-prep fs/proc/inode.c
--- devel/fs/proc/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/proc/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -60,8 +60,6 @@ static void proc_delete_inode(struct ino
 	struct proc_dir_entry *de;
 	struct task_struct *tsk;
 
-	truncate_inode_pages(&inode->i_data, 0);
-
 	/* Let go of any associated process */
 	tsk = PROC_I(inode)->task;
 	if (tsk)
diff -puN fs/qnx4/inode.c~ocfs2-prep fs/qnx4/inode.c
--- devel/fs/qnx4/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/qnx4/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -63,7 +63,6 @@ int qnx4_sync_inode(struct inode *inode)
 static void qnx4_delete_inode(struct inode *inode)
 {
 	QNX4DEBUG(("qnx4: deleting inode [%lu]\n", (unsigned long) inode->i_ino));
-	truncate_inode_pages(&inode->i_data, 0);
 	inode->i_size = 0;
 	qnx4_truncate(inode);
 	lock_kernel();
diff -puN fs/reiserfs/inode.c~ocfs2-prep fs/reiserfs/inode.c
--- devel/fs/reiserfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/reiserfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -33,8 +33,6 @@ void reiserfs_delete_inode(struct inode 
 	    2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb);
 	struct reiserfs_transaction_handle th;
 
-	truncate_inode_pages(&inode->i_data, 0);
-
 	reiserfs_write_lock(inode->i_sb);
 
 	/* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */
diff -puN fs/smbfs/inode.c~ocfs2-prep fs/smbfs/inode.c
--- devel/fs/smbfs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/smbfs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -331,7 +331,6 @@ static void
 smb_delete_inode(struct inode *ino)
 {
 	DEBUG1("ino=%ld\n", ino->i_ino);
-	truncate_inode_pages(&ino->i_data, 0);
 	lock_kernel();
 	if (smb_close(ino))
 		PARANOIA("could not close inode %ld\n", ino->i_ino);
diff -puN fs/sysv/inode.c~ocfs2-prep fs/sysv/inode.c
--- devel/fs/sysv/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/sysv/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -292,7 +292,6 @@ int sysv_sync_inode(struct inode * inode
 
 static void sysv_delete_inode(struct inode *inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
 	inode->i_size = 0;
 	sysv_truncate(inode);
 	lock_kernel();
diff -puN fs/udf/inode.c~ocfs2-prep fs/udf/inode.c
--- devel/fs/udf/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/udf/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -87,8 +87,6 @@ static int udf_get_block(struct inode *,
  */
 void udf_delete_inode(struct inode * inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
-
 	if (is_bad_inode(inode))
 		goto no_delete;
 
diff -puN fs/ufs/inode.c~ocfs2-prep fs/ufs/inode.c
--- devel/fs/ufs/inode.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/fs/ufs/inode.c	2005-08-30 17:01:18.000000000 -0700
@@ -804,7 +804,6 @@ int ufs_sync_inode (struct inode *inode)
 
 void ufs_delete_inode (struct inode * inode)
 {
-	truncate_inode_pages(&inode->i_data, 0);
 	/*UFS_I(inode)->i_dtime = CURRENT_TIME;*/
 	lock_kernel();
 	mark_inode_dirty(inode);
diff -puN mm/shmem.c~ocfs2-prep mm/shmem.c
--- devel/mm/shmem.c~ocfs2-prep	2005-08-30 17:01:18.000000000 -0700
+++ devel-akpm/mm/shmem.c	2005-08-30 17:01:18.000000000 -0700
@@ -668,7 +668,6 @@ static void shmem_delete_inode(struct in
 	struct shmem_inode_info *info = SHMEM_I(inode);
 
 	if (inode->i_op->truncate == shmem_truncate) {
-		truncate_inode_pages(inode->i_mapping, 0);
 		shmem_unacct_size(info->flags, inode->i_size);
 		inode->i_size = 0;
 		shmem_truncate(inode);
_