f2fs: add migrate_page to avoid patch conflicts
This is disabled by default. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
aa4638c4e5
commit
9363031a57
|
@ -387,6 +387,9 @@ const struct address_space_operations f2fs_meta_aops = {
|
|||
.set_page_dirty = f2fs_set_meta_page_dirty,
|
||||
.invalidatepage = f2fs_invalidate_page,
|
||||
.releasepage = f2fs_release_page,
|
||||
#ifdef CONFIG_F2FS_MIGRATION
|
||||
.migratepage = f2fs_migrate_page,
|
||||
#endif
|
||||
};
|
||||
|
||||
static void __add_ino_entry(struct f2fs_sb_info *sbi, nid_t ino, int type)
|
||||
|
|
|
@ -1971,6 +1971,58 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
|
|||
return generic_block_bmap(mapping, block, get_data_block_bmap);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_F2FS_MIGRATION
|
||||
#include <linux/migrate.h>
|
||||
|
||||
int f2fs_migrate_page(struct address_space *mapping,
|
||||
struct page *newpage, struct page *page, enum migrate_mode mode)
|
||||
{
|
||||
int rc, extra_count;
|
||||
struct f2fs_inode_info *fi = F2FS_I(mapping->host);
|
||||
bool atomic_written = IS_ATOMIC_WRITTEN_PAGE(page);
|
||||
|
||||
BUG_ON(PageWriteback(page));
|
||||
|
||||
/* migrating an atomic written page is safe with the inmem_lock hold */
|
||||
if (atomic_written && !mutex_trylock(&fi->inmem_lock))
|
||||
return -EAGAIN;
|
||||
|
||||
/*
|
||||
* A reference is expected if PagePrivate set when move mapping,
|
||||
* however F2FS breaks this for maintaining dirty page counts when
|
||||
* truncating pages. So here adjusting the 'extra_count' make it work.
|
||||
*/
|
||||
extra_count = (atomic_written ? 1 : 0) - page_has_private(page);
|
||||
rc = migrate_page_move_mapping(mapping, newpage,
|
||||
page, NULL, mode, extra_count);
|
||||
if (rc != MIGRATEPAGE_SUCCESS) {
|
||||
if (atomic_written)
|
||||
mutex_unlock(&fi->inmem_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (atomic_written) {
|
||||
struct inmem_pages *cur;
|
||||
list_for_each_entry(cur, &fi->inmem_pages, list)
|
||||
if (cur->page == page) {
|
||||
cur->page = newpage;
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&fi->inmem_lock);
|
||||
put_page(page);
|
||||
get_page(newpage);
|
||||
}
|
||||
|
||||
if (PagePrivate(page))
|
||||
SetPagePrivate(newpage);
|
||||
set_page_private(newpage, page_private(page));
|
||||
|
||||
migrate_page_copy(newpage, page);
|
||||
|
||||
return MIGRATEPAGE_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct address_space_operations f2fs_dblock_aops = {
|
||||
.readpage = f2fs_read_data_page,
|
||||
.readpages = f2fs_read_data_pages,
|
||||
|
@ -1983,4 +2035,7 @@ const struct address_space_operations f2fs_dblock_aops = {
|
|||
.releasepage = f2fs_release_page,
|
||||
.direct_IO = f2fs_direct_IO,
|
||||
.bmap = f2fs_bmap,
|
||||
#ifdef CONFIG_F2FS_MIGRATION
|
||||
.migratepage = f2fs_migrate_page,
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -2299,6 +2299,10 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64);
|
|||
void f2fs_set_page_dirty_nobuffers(struct page *);
|
||||
void f2fs_invalidate_page(struct page *, unsigned long);
|
||||
int f2fs_release_page(struct page *, gfp_t);
|
||||
#ifdef CONFIG_F2FS_MIGRATION
|
||||
int f2fs_migrate_page(struct address_space *, struct page *, struct page *,
|
||||
enum migrate_mode);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* gc.c
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/* fill fi->keyring_key */
|
||||
int f2fs_validate_key(struct inode *inode)
|
||||
{
|
||||
u8 full_key_descriptor[FS_KEY_DESC_PREFIX_SIZE +
|
||||
(FS_KEY_DESCRIPTOR_SIZE * 2) + 1];
|
||||
struct key *keyring_key = NULL;
|
||||
u8 key[F2FS_SET_KEY_SIZE];
|
||||
int ret;
|
||||
|
||||
ret = f2fs_getxattr(inode, F2FS_XATTR_INDEX_KEY,
|
||||
F2FS_XATTR_NAME_ENCRYPTION_CONTEXT,
|
||||
key, F2FS_SET_KEY_SIZE, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memcpy(full_key_descriptor, F2FS_KEY_DESC_PREFIX,
|
||||
F2FS_KEY_DESC_PREFIX_SIZE);
|
||||
sprintf(full_key_descriptor + F2FS_KEY_DESC_PREFIX_SIZE,
|
||||
"%*phN", F2FS_KEY_DESCRIPTOR_SIZE, key);
|
||||
full_key_descriptor[F2FS_KEY_DESC_PREFIX_SIZE +
|
||||
(2 * F2FS_KEY_DESCRIPTOR_SIZE)] = '\0';
|
||||
keyring_key = request_key(&key_type_logon, full_key_descriptor, NULL);
|
||||
if (IS_ERR(keyring_key))
|
||||
return PTR_ERR(keyring_key);
|
||||
|
||||
if (keyring_key->type != &key_type_logon) {
|
||||
printk_once(KERN_WARNING
|
||||
"%s: key type must be logon\n", __func__);
|
||||
key_put(keyring_key);
|
||||
return -ENOKEY;
|
||||
}
|
||||
key_put(keyring_key);
|
||||
return 0;
|
||||
}
|
|
@ -1705,6 +1705,9 @@ const struct address_space_operations f2fs_node_aops = {
|
|||
.set_page_dirty = f2fs_set_node_page_dirty,
|
||||
.invalidatepage = f2fs_invalidate_page,
|
||||
.releasepage = f2fs_release_page,
|
||||
#ifdef CONFIG_F2FS_MIGRATION
|
||||
.migratepage = f2fs_migrate_page,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct free_nid *__lookup_free_nid_list(struct f2fs_nm_info *nm_i,
|
||||
|
|
Loading…
Reference in New Issue