mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 15:27:29 +00:00
[PATCH] Direct Migration V9: Avoid writeback / page_migrate() method
Migrate a page with buffers without requiring writeback This introduces a new address space operation migratepage() that may be used by a filesystem to implement its own version of page migration. A version is provided that migrates buffers attached to pages. Some filesystems (ext2, ext3, xfs) are modified to utilize this feature. The swapper address space operation are modified so that a regular migrate_page() will occur for anonymous pages without writeback (migrate_pages forces every anonymous page to have a swap entry). Signed-off-by: Mike Kravetz <kravetz@us.ibm.com> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
7e2ab150d1
commit
e965f9630c
10 changed files with 100 additions and 1 deletions
60
fs/buffer.c
60
fs/buffer.c
|
@ -3049,6 +3049,66 @@ asmlinkage long sys_bdflush(int func, long data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Migration function for pages with buffers. This function can only be used
|
||||
* if the underlying filesystem guarantees that no other references to "page"
|
||||
* exist.
|
||||
*/
|
||||
#ifdef CONFIG_MIGRATION
|
||||
int buffer_migrate_page(struct page *newpage, struct page *page)
|
||||
{
|
||||
struct address_space *mapping = page->mapping;
|
||||
struct buffer_head *bh, *head;
|
||||
|
||||
if (!mapping)
|
||||
return -EAGAIN;
|
||||
|
||||
if (!page_has_buffers(page))
|
||||
return migrate_page(newpage, page);
|
||||
|
||||
head = page_buffers(page);
|
||||
|
||||
if (migrate_page_remove_references(newpage, page, 3))
|
||||
return -EAGAIN;
|
||||
|
||||
bh = head;
|
||||
do {
|
||||
get_bh(bh);
|
||||
lock_buffer(bh);
|
||||
bh = bh->b_this_page;
|
||||
|
||||
} while (bh != head);
|
||||
|
||||
ClearPagePrivate(page);
|
||||
set_page_private(newpage, page_private(page));
|
||||
set_page_private(page, 0);
|
||||
put_page(page);
|
||||
get_page(newpage);
|
||||
|
||||
bh = head;
|
||||
do {
|
||||
set_bh_page(bh, newpage, bh_offset(bh));
|
||||
bh = bh->b_this_page;
|
||||
|
||||
} while (bh != head);
|
||||
|
||||
SetPagePrivate(newpage);
|
||||
|
||||
migrate_page_copy(newpage, page);
|
||||
|
||||
bh = head;
|
||||
do {
|
||||
unlock_buffer(bh);
|
||||
put_bh(bh);
|
||||
bh = bh->b_this_page;
|
||||
|
||||
} while (bh != head);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(buffer_migrate_page);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Buffer-head allocation
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue