tux3: Support mmap write: Add support of mlock page handling
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
diff --git a/fs/tux3/buffer_fork.c b/fs/tux3/buffer_fork.c
index c1530c2..add08ae 100644
--- a/fs/tux3/buffer_fork.c
+++ b/fs/tux3/buffer_fork.c
@@ -365,7 +365,8 @@
BUG_ON(PageForked(oldpage));
/* FIXME: right? */
- BUG_ON(PageUnevictable(oldpage));
+ BUG_ON(PageSwapCache(oldpage));
+ BUG_ON(PageSwapBacked(oldpage));
BUG_ON(PageHuge(oldpage));
if (PageError(oldpage))
SetPageError(newpage);
@@ -385,9 +386,10 @@
*/
cpupid = page_cpupid_xchg_last(oldpage, -1);
page_cpupid_xchg_last(newpage, cpupid);
-
- mlock_migrate_page(newpage, page);
- ksm_migrate_page(newpage, page);
+#endif
+ mlock_migrate_page(newpage, oldpage);
+#if 0
+ ksm_migrate_page(newpage, oldpage);
#endif
/* Lock newpage before visible via radix tree */
diff --git a/fs/tux3/mmap_builtin_hack.h b/fs/tux3/mmap_builtin_hack.h
index b313506..2ffffdc 100644
--- a/fs/tux3/mmap_builtin_hack.h
+++ b/fs/tux3/mmap_builtin_hack.h
@@ -1,6 +1,34 @@
#ifndef _MMAP_HACK_H
#define _MMAP_HACK_H
+/*
+ * FIXME: copied from mm/internal.h. We should move some functions to
+ * mm/, then share codes.
+ */
+static inline void mlock_migrate_page(struct page *newpage, struct page *page)
+{
+ if (TestClearPageMlocked(page)) {
+ unsigned long flags;
+ int nr_pages = hpage_nr_pages(page);
+
+ local_irq_save(flags);
+ __mod_zone_page_state(page_zone(page), NR_MLOCK, -nr_pages);
+ SetPageMlocked(newpage);
+ __mod_zone_page_state(page_zone(newpage), NR_MLOCK, nr_pages);
+ local_irq_restore(flags);
+#if 0
+ /*
+ * FIXME: maybe, we should remove page from LRU, then
+ * putback to LRU. With it, Unevictable will be removed.
+ *
+ * if (!isolate_lru_page(page))
+ * putback_lru_page(page);
+ */
+ BUG_ON(PageUnevictable(page));
+#endif
+ }
+}
+
#ifdef CONFIG_TUX3_MMAP
int page_cow_file(struct page *oldpage, struct page *newpage);
#else