

Memory migration might be rolled back during file truncation.
In this case these pages must be checked whether it has happened.

Signed-off-by: Hirokazu Takahashi <taka@valinux.co.jp>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 memhotplug1-dave/mm/truncate.c |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+)

diff -puN mm/truncate.c~P11-migrate-truncate mm/truncate.c
--- memhotplug1/mm/truncate.c~P11-migrate-truncate	2004-11-04 16:46:04.000000000 -0800
+++ memhotplug1-dave/mm/truncate.c	2004-11-04 16:46:04.000000000 -0800
@@ -164,6 +164,9 @@ void truncate_inode_pages_range(struct a
 				unlock_page(page);
 				continue;
 			}
+			/* page->mapping check is done in
+			 * truncate_complete_page() when the page has been
+			 * migrated. */
 			truncate_complete_page(mapping, page);
 			unlock_page(page);
 		}
@@ -200,6 +203,16 @@ void truncate_inode_pages_range(struct a
 			if (page->index > end)
 				break;
 			lock_page(page);
+			if (page->mapping == NULL) {
+				struct page *newpage;
+				unlock_page(page);
+				if ((newpage = find_lock_page(mapping, page->index))) {
+					/* memory migration has been rolled back. */
+					page_cache_release(page);
+					pvec.pages[i] = page = newpage;
+				} else
+					lock_page(page);
+			}
 			wait_on_page_writeback(page);
 			if (page->index > next)
 				next = page->index;
@@ -306,6 +319,16 @@ int invalidate_inode_pages2(struct addre
 			int was_dirty;
 
 			lock_page(page);
+ 			if (page->mapping == NULL) {
+ 				struct page *newpage;
+ 				unlock_page(page);
+ 				if ((newpage = find_lock_page(mapping, page->index))) {
+ 					/* memory migration has been rolled back. */
+ 					page_cache_release(page);
+ 					pvec.pages[i] = page = newpage;
+ 				} else
+ 					lock_page(page);
+ 			}
 			if (page->mapping != mapping) {	/* truncate race? */
 				unlock_page(page);
 				continue;
_
