|
@@ -52,6 +52,7 @@
|
|
#include "ubifs.h"
|
|
#include "ubifs.h"
|
|
#include <linux/mount.h>
|
|
#include <linux/mount.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
|
+#include <linux/migrate.h>
|
|
|
|
|
|
static int read_block(struct inode *inode, void *addr, unsigned int block,
|
|
static int read_block(struct inode *inode, void *addr, unsigned int block,
|
|
struct ubifs_data_node *dn)
|
|
struct ubifs_data_node *dn)
|
|
@@ -1452,6 +1453,26 @@ static int ubifs_set_page_dirty(struct page *page)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_MIGRATION
|
|
|
|
+static int ubifs_migrate_page(struct address_space *mapping,
|
|
|
|
+ struct page *newpage, struct page *page, enum migrate_mode mode)
|
|
|
|
+{
|
|
|
|
+ int rc;
|
|
|
|
+
|
|
|
|
+ rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0);
|
|
|
|
+ if (rc != MIGRATEPAGE_SUCCESS)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ if (PagePrivate(page)) {
|
|
|
|
+ ClearPagePrivate(page);
|
|
|
|
+ SetPagePrivate(newpage);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ migrate_page_copy(newpage, page);
|
|
|
|
+ return MIGRATEPAGE_SUCCESS;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
|
|
static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
|
|
{
|
|
{
|
|
/*
|
|
/*
|
|
@@ -1591,6 +1612,9 @@ const struct address_space_operations ubifs_file_address_operations = {
|
|
.write_end = ubifs_write_end,
|
|
.write_end = ubifs_write_end,
|
|
.invalidatepage = ubifs_invalidatepage,
|
|
.invalidatepage = ubifs_invalidatepage,
|
|
.set_page_dirty = ubifs_set_page_dirty,
|
|
.set_page_dirty = ubifs_set_page_dirty,
|
|
|
|
+#ifdef CONFIG_MIGRATION
|
|
|
|
+ .migratepage = ubifs_migrate_page,
|
|
|
|
+#endif
|
|
.releasepage = ubifs_releasepage,
|
|
.releasepage = ubifs_releasepage,
|
|
};
|
|
};
|
|
|
|
|