f2fs: do not make dirty any inmemory pages
This patch let inmemory pages be clean all the time. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
f4ca536f71
commit
34ba94bac9
4 changed files with 22 additions and 5 deletions
|
@ -1052,10 +1052,7 @@ static int f2fs_write_end(struct file *file,
|
||||||
|
|
||||||
trace_f2fs_write_end(inode, pos, len, copied);
|
trace_f2fs_write_end(inode, pos, len, copied);
|
||||||
|
|
||||||
if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
|
set_page_dirty(page);
|
||||||
register_inmem_page(inode, page);
|
|
||||||
else
|
|
||||||
set_page_dirty(page);
|
|
||||||
|
|
||||||
if (pos + copied > i_size_read(inode)) {
|
if (pos + copied > i_size_read(inode)) {
|
||||||
i_size_write(inode, pos + copied);
|
i_size_write(inode, pos + copied);
|
||||||
|
@ -1138,6 +1135,12 @@ static int f2fs_set_data_page_dirty(struct page *page)
|
||||||
trace_f2fs_set_page_dirty(page, DATA);
|
trace_f2fs_set_page_dirty(page, DATA);
|
||||||
|
|
||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
|
|
||||||
|
if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode)) {
|
||||||
|
register_inmem_page(inode, page);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
mark_inode_dirty(inode);
|
mark_inode_dirty(inode);
|
||||||
|
|
||||||
if (!PageDirty(page)) {
|
if (!PageDirty(page)) {
|
||||||
|
|
|
@ -269,6 +269,7 @@ struct f2fs_inode_info {
|
||||||
struct extent_info ext; /* in-memory extent cache entry */
|
struct extent_info ext; /* in-memory extent cache entry */
|
||||||
struct dir_inode_entry *dirty_dir; /* the pointer of dirty dir */
|
struct dir_inode_entry *dirty_dir; /* the pointer of dirty dir */
|
||||||
|
|
||||||
|
struct radix_tree_root inmem_root; /* radix tree for inmem pages */
|
||||||
struct list_head inmem_pages; /* inmemory pages managed by f2fs */
|
struct list_head inmem_pages; /* inmemory pages managed by f2fs */
|
||||||
struct mutex inmem_lock; /* lock for inmemory pages */
|
struct mutex inmem_lock; /* lock for inmemory pages */
|
||||||
};
|
};
|
||||||
|
|
|
@ -178,7 +178,8 @@ void register_inmem_page(struct inode *inode, struct page *page)
|
||||||
{
|
{
|
||||||
struct f2fs_inode_info *fi = F2FS_I(inode);
|
struct f2fs_inode_info *fi = F2FS_I(inode);
|
||||||
struct inmem_pages *new;
|
struct inmem_pages *new;
|
||||||
|
int err;
|
||||||
|
retry:
|
||||||
new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
|
new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
|
||||||
|
|
||||||
/* add atomic page indices to the list */
|
/* add atomic page indices to the list */
|
||||||
|
@ -187,6 +188,16 @@ void register_inmem_page(struct inode *inode, struct page *page)
|
||||||
|
|
||||||
/* increase reference count with clean state */
|
/* increase reference count with clean state */
|
||||||
mutex_lock(&fi->inmem_lock);
|
mutex_lock(&fi->inmem_lock);
|
||||||
|
err = radix_tree_insert(&fi->inmem_root, page->index, new);
|
||||||
|
if (err == -EEXIST) {
|
||||||
|
mutex_unlock(&fi->inmem_lock);
|
||||||
|
kmem_cache_free(inmem_entry_slab, new);
|
||||||
|
return;
|
||||||
|
} else if (err) {
|
||||||
|
mutex_unlock(&fi->inmem_lock);
|
||||||
|
kmem_cache_free(inmem_entry_slab, new);
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
get_page(page);
|
get_page(page);
|
||||||
list_add_tail(&new->list, &fi->inmem_pages);
|
list_add_tail(&new->list, &fi->inmem_pages);
|
||||||
mutex_unlock(&fi->inmem_lock);
|
mutex_unlock(&fi->inmem_lock);
|
||||||
|
@ -216,6 +227,7 @@ void commit_inmem_pages(struct inode *inode, bool abort)
|
||||||
do_write_data_page(cur->page, &fio);
|
do_write_data_page(cur->page, &fio);
|
||||||
submit_bio = true;
|
submit_bio = true;
|
||||||
}
|
}
|
||||||
|
radix_tree_delete(&fi->inmem_root, cur->page->index);
|
||||||
f2fs_put_page(cur->page, 1);
|
f2fs_put_page(cur->page, 1);
|
||||||
list_del(&cur->list);
|
list_del(&cur->list);
|
||||||
kmem_cache_free(inmem_entry_slab, cur);
|
kmem_cache_free(inmem_entry_slab, cur);
|
||||||
|
|
|
@ -373,6 +373,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
|
||||||
fi->i_advise = 0;
|
fi->i_advise = 0;
|
||||||
rwlock_init(&fi->ext.ext_lock);
|
rwlock_init(&fi->ext.ext_lock);
|
||||||
init_rwsem(&fi->i_sem);
|
init_rwsem(&fi->i_sem);
|
||||||
|
INIT_RADIX_TREE(&fi->inmem_root, GFP_NOFS);
|
||||||
INIT_LIST_HEAD(&fi->inmem_pages);
|
INIT_LIST_HEAD(&fi->inmem_pages);
|
||||||
mutex_init(&fi->inmem_lock);
|
mutex_init(&fi->inmem_lock);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue