Index: 2.6.x-xfs/fs/buffer.c
===================================================================
--- 2.6.x-xfs.orig/fs/buffer.c Tue May 11 14:54:16 2004
+++ 2.6.x-xfs/fs/buffer.c Wed May 19 13:13:40 2004
@@ -527,20 +527,22 @@
/*
* Kick pdflush then try to free up some ZONE_NORMAL memory.
*/
-static void free_more_memory(void)
+void free_more_memory(unsigned int gfp_mask)
{
struct zone **zones;
pg_data_t *pgdat;
wakeup_bdflush(1024);
- yield();
+ set_current_state(TASK_UNINTERRUPTIBLE);
+ schedule_timeout(10);
for_each_pgdat(pgdat) {
- zones = pgdat->node_zonelists[GFP_NOFS&GFP_ZONEMASK].zones;
+ zones = pgdat->node_zonelists[gfp_mask & GFP_ZONEMASK].zones;
if (*zones)
- try_to_free_pages(zones, GFP_NOFS, 0);
+ try_to_free_pages(zones, gfp_mask, 0);
}
}
+EXPORT_SYMBOL(free_more_memory);
/*
* I/O completion handler for block_read_full_page() - pages
@@ -1093,7 +1095,7 @@
* the reserve list is empty, we're sure there are
* async buffer heads in use.
*/
- free_more_memory();
+ free_more_memory(GFP_NOFS);
goto try_again;
}
@@ -1241,7 +1243,7 @@
return bh;
if (!grow_buffers(bdev, block, size))
- free_more_memory();
+ free_more_memory(GFP_NOFS);
}
}
Index: 2.6.x-xfs/include/linux/buffer_head.h
===================================================================
--- 2.6.x-xfs.orig/include/linux/buffer_head.h Tue May 11 14:54:16 2004
+++ 2.6.x-xfs/include/linux/buffer_head.h Wed May 19 13:13:40 2004
@@ -134,6 +134,7 @@
int try_to_free_buffers(struct page *);
void create_empty_buffers(struct page *, unsigned long,
unsigned long b_state);
+void free_more_memory(unsigned int gfp_mask);
void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
void end_buffer_async_write(struct buffer_head *bh, int uptodate);