From: Roman Zippel Call try_to_free_buffers() when a page can be released. This behaviour changed during 2.5 and wasn't fixed in hfs while porting it to 2.6. Also remove an unnecessary PageActive() check, only the node ref count is really relevant. Signed-off-by: Roman Zippel Signed-off-by: Andrew Morton --- 25-akpm/fs/hfs/inode.c | 8 +------- 25-akpm/fs/hfsplus/inode.c | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff -puN fs/hfs/inode.c~hfs-free-page-buffers-in-releasepage fs/hfs/inode.c --- 25/fs/hfs/inode.c~hfs-free-page-buffers-in-releasepage 2005-03-18 23:42:51.000000000 -0800 +++ 25-akpm/fs/hfs/inode.c 2005-03-18 23:42:51.000000000 -0800 @@ -74,12 +74,6 @@ static int hfs_releasepage(struct page * ; else if (atomic_read(&node->refcnt)) res = 0; - else for (i = 0; i < tree->pages_per_bnode; i++) { - if (PageActive(node->page[i])) { - res = 0; - break; - } - } if (res && node) { hfs_bnode_unhash(node); hfs_bnode_free(node); @@ -103,7 +97,7 @@ static int hfs_releasepage(struct page * spin_unlock(&tree->hash_lock); } //printk("releasepage: %lu,%x = %d\n", page->index, mask, res); - return res; + return res ? try_to_free_buffers(page) : 0; } static int hfs_get_blocks(struct inode *inode, sector_t iblock, unsigned long max_blocks, diff -puN fs/hfsplus/inode.c~hfs-free-page-buffers-in-releasepage fs/hfsplus/inode.c --- 25/fs/hfsplus/inode.c~hfs-free-page-buffers-in-releasepage 2005-03-18 23:42:51.000000000 -0800 +++ 25-akpm/fs/hfsplus/inode.c 2005-03-18 23:42:51.000000000 -0800 @@ -71,12 +71,6 @@ static int hfsplus_releasepage(struct pa ; else if (atomic_read(&node->refcnt)) res = 0; - else for (i = 0; i < tree->pages_per_bnode; i++) { - if (PageActive(node->page[i])) { - res = 0; - break; - } - } if (res && node) { hfs_bnode_unhash(node); hfs_bnode_free(node); @@ -100,7 +94,7 @@ static int hfsplus_releasepage(struct pa spin_unlock(&tree->hash_lock); } //printk("releasepage: %lu,%x = %d\n", page->index, mask, res); - return res; + return res ? try_to_free_buffers(page) : 0; } static int hfsplus_get_blocks(struct inode *inode, sector_t iblock, unsigned long max_blocks, _