 fs/buffer.c |   10 +++++++---
 mm/rmap.c   |   15 ++++++++++++---
 2 files changed, 19 insertions(+), 6 deletions(-)

diff -puN fs/buffer.c~anobjrmap-ttfb-no-BUG fs/buffer.c
--- 25/fs/buffer.c~anobjrmap-ttfb-no-BUG	2003-03-20 20:13:32.000000000 -0800
+++ 25-akpm/fs/buffer.c	2003-03-20 20:37:17.000000000 -0800
@@ -2721,14 +2721,18 @@ int try_to_free_buffers(struct page *pag
 	struct buffer_head *buffers_to_free = NULL;
 	int ret = 0;
 
-	BUG_ON(!mapping);
 	BUG_ON(!PageLocked(page));
 	if (PageWriteback(page))
 		return 0;
 
+	if (mapping == NULL) {		/* truncated but still bufferful */
+		ret = drop_buffers(page, &buffers_to_free);
+		goto out;
+	}
+
 	spin_lock(&mapping->private_lock);
 	ret = drop_buffers(page, &buffers_to_free);
-	if (ret) {
+	if (ret && !PageSwapCache(page)) {
 		/*
 		 * If the filesystem writes its buffers by hand (eg ext3)
 		 * then we can have clean buffers against a dirty page.  We
@@ -2740,7 +2744,7 @@ int try_to_free_buffers(struct page *pag
 		clear_page_dirty(page);
 	}
 	spin_unlock(&mapping->private_lock);
-
+out:
 	if (buffers_to_free) {
 		struct buffer_head *bh = buffers_to_free;
 

