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;