From b4bb48937fcd05c16c8ba580edc67fdf17fde5b9 Mon Sep 17 00:00:00 2001 From: Christoph Lameter Date: Tue, 14 Mar 2006 19:50:19 -0800 Subject: [PATCH] --- yaml --- r: 21047 b: refs/heads/master c: 4983da07f1e2e8dc81cb9d640fbf35b899cdbdf2 h: refs/heads/master i: 21045: 9a5f6b5177e4c4db28a73fd194688e8f40813bca 21043: 0f23fef021657cdaa788df1cee3b7332a073cc30 21039: 398208a4db6dba60d66bbba6847d794b6b33b0f3 v: v3 --- [refs] | 2 +- trunk/fs/buffer.c | 6 ++++-- trunk/mm/vmscan.c | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 0e8e33360d20..27b8c968ed68 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e843e280cbe218fc8387339806d344708dee348a +refs/heads/master: 4983da07f1e2e8dc81cb9d640fbf35b899cdbdf2 diff --git a/trunk/fs/buffer.c b/trunk/fs/buffer.c index 62cfd17dc5fe..a9b399402007 100644 --- a/trunk/fs/buffer.c +++ b/trunk/fs/buffer.c @@ -3060,6 +3060,7 @@ int buffer_migrate_page(struct page *newpage, struct page *page) { struct address_space *mapping = page->mapping; struct buffer_head *bh, *head; + int rc; if (!mapping) return -EAGAIN; @@ -3069,8 +3070,9 @@ int buffer_migrate_page(struct page *newpage, struct page *page) head = page_buffers(page); - if (migrate_page_remove_references(newpage, page, 3)) - return -EAGAIN; + rc = migrate_page_remove_references(newpage, page, 3); + if (rc) + return rc; bh = head; do { diff --git a/trunk/mm/vmscan.c b/trunk/mm/vmscan.c index 7ccf763bb30b..4fe7e3aa02e2 100644 --- a/trunk/mm/vmscan.c +++ b/trunk/mm/vmscan.c @@ -700,7 +700,7 @@ int migrate_page_remove_references(struct page *newpage, * the page. */ if (!mapping || page_mapcount(page) + nr_refs != page_count(page)) - return 1; + return -EAGAIN; /* * Establish swap ptes for anonymous pages or destroy pte @@ -721,13 +721,15 @@ int migrate_page_remove_references(struct page *newpage, * If the page was not migrated then the PageSwapCache bit * is still set and the operation may continue. */ - try_to_unmap(page, 1); + if (try_to_unmap(page, 1) == SWAP_FAIL) + /* A vma has VM_LOCKED set -> Permanent failure */ + return -EPERM; /* * Give up if we were unable to remove all mappings. */ if (page_mapcount(page)) - return 1; + return -EAGAIN; write_lock_irq(&mapping->tree_lock); @@ -738,7 +740,7 @@ int migrate_page_remove_references(struct page *newpage, if (!page_mapping(page) || page_count(page) != nr_refs || *radix_pointer != page) { write_unlock_irq(&mapping->tree_lock); - return 1; + return -EAGAIN; } /* @@ -813,10 +815,14 @@ EXPORT_SYMBOL(migrate_page_copy); */ int migrate_page(struct page *newpage, struct page *page) { + int rc; + BUG_ON(PageWriteback(page)); /* Writeback must be complete */ - if (migrate_page_remove_references(newpage, page, 2)) - return -EAGAIN; + rc = migrate_page_remove_references(newpage, page, 2); + + if (rc) + return rc; migrate_page_copy(newpage, page);