]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] Fix PG_launder
authorAndrew Morton <akpm@zip.com.au>
Sun, 5 May 2002 08:10:26 +0000 (01:10 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sun, 5 May 2002 08:10:26 +0000 (01:10 -0700)
Set PG_launder against pages which are under VM writeback.  So page
allocators will throttle against them.

fs/fs-writeback.c
include/linux/page-flags.h
mm/filemap.c
mm/page-writeback.c

index 1c46f668217682b535b1c1ea8fd24297e1ff80f3..eadb01f85bd2a751425e9f115157ba40349783d3 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/spinlock.h>
 #include <linux/sched.h>
 #include <linux/fs.h>
+#include <linux/mm.h>
 #include <linux/writeback.h>
 
 /**
@@ -135,7 +136,7 @@ static void __sync_single_inode(struct inode *inode, int wait, int *nr_to_write)
        if (mapping->a_ops->writeback_mapping)
                mapping->a_ops->writeback_mapping(mapping, nr_to_write);
        else
-               filemap_fdatawrite(mapping);
+               generic_writeback_mapping(mapping, NULL);
 
        /* Don't write the inode if only I_DIRTY_PAGES was set */
        if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC))
index 943e87c09c545007f7c1c98514d06e4c34fef96d..f56db65ebef3f601a93970c2251fd48c6a830574 100644 (file)
@@ -174,6 +174,7 @@ extern void get_page_state(struct page_state *ret);
 
 #define PageLaunder(page)      test_bit(PG_launder, &(page)->flags)
 #define SetPageLaunder(page)   set_bit(PG_launder, &(page)->flags)
+#define ClearPageLaunder(page) clear_bit(PG_launder, &(page)->flags)
 
 #define SetPagePrivate(page)   set_bit(PG_private, &(page)->flags)
 #define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags)
index 9c5002f1e2d5e17e60f3ae408bf8bbe57618bc83..db1174be3688aece84790309c0fcde1ab7a7c775 100644 (file)
@@ -659,7 +659,6 @@ EXPORT_SYMBOL(wait_on_page_writeback);
 void unlock_page(struct page *page)
 {
        wait_queue_head_t *waitqueue = page_waitqueue(page);
-       clear_bit(PG_launder, &(page)->flags);
        smp_mb__before_clear_bit();
        if (!TestClearPageLocked(page))
                BUG();
@@ -674,7 +673,7 @@ void unlock_page(struct page *page)
 void end_page_writeback(struct page *page)
 {
        wait_queue_head_t *waitqueue = page_waitqueue(page);
-       clear_bit(PG_launder, &(page)->flags);
+       ClearPageLaunder(page);
        smp_mb__before_clear_bit();
        if (!TestClearPageWriteback(page))
                BUG();
index 6b73400f8e4fbf6d488a786d29695d1458f6a75d..40e80dff9369c9d2f7827f7eadace60f89a4c247 100644 (file)
@@ -354,6 +354,8 @@ int generic_writeback_mapping(struct address_space *mapping, int *nr_to_write)
                lock_page(page);
 
                if (TestClearPageDirty(page)) {
+                       if (current->flags & PF_MEMALLOC)
+                               SetPageLaunder(page);
                        err = writepage(page);
                        if (!ret)
                                ret = err;