From: Hugh Dickins <hugh@veritas.com>

Recent testing has shown that swapoff can sneak a page back into the
tmpfs page cache after truncate_inode_pages has cleaned it, before
shmem_truncate resets next_index to stop that: BUG_ON(inode->i_blocks)
in shmem_delete_inode.  So call truncate_inode_pages again to be safe.



 25-akpm/mm/shmem.c |   10 ++++++++++
 1 files changed, 10 insertions(+)

diff -puN mm/shmem.c~hugh-09-tmpfs-truncation mm/shmem.c
--- 25/mm/shmem.c~hugh-09-tmpfs-truncation	Tue Mar 25 18:34:56 2003
+++ 25-akpm/mm/shmem.c	Tue Mar 25 18:34:56 2003
@@ -486,6 +486,16 @@ done1:
 	}
 done2:
 	BUG_ON(info->swapped > info->next_index);
+	if (inode->i_mapping->nrpages) {
+		/*
+		 * Call truncate_inode_pages again: racing shmem_unuse_inode
+		 * may have swizzled a page in from swap since vmtruncate or
+		 * generic_delete_inode did it, before we lowered next_index.
+		 */
+		spin_unlock(&info->lock);
+		truncate_inode_pages(inode->i_mapping, inode->i_size);
+		spin_lock(&info->lock);
+	}
 	shmem_recalc_inode(inode);
 	spin_unlock(&info->lock);
 }

_