Commit b3783873 authored by Jaegeuk Kim's avatar Jaegeuk Kim

f2fs: avoid freqeunt write_inode calls

If update_inode is called, we don't need to do write_inode.
So, let's use a *dirty* flag for each inode.
Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
parent d7cc950b
...@@ -856,6 +856,7 @@ static inline int f2fs_clear_bit(unsigned int nr, char *addr) ...@@ -856,6 +856,7 @@ static inline int f2fs_clear_bit(unsigned int nr, char *addr)
/* used for f2fs_inode_info->flags */ /* used for f2fs_inode_info->flags */
enum { enum {
FI_NEW_INODE, /* indicate newly allocated inode */ FI_NEW_INODE, /* indicate newly allocated inode */
FI_DIRTY_INODE, /* indicate inode is dirty or not */
FI_INC_LINK, /* need to increment i_nlink */ FI_INC_LINK, /* need to increment i_nlink */
FI_ACL_MODE, /* indicate acl mode */ FI_ACL_MODE, /* indicate acl mode */
FI_NO_ALLOC, /* should not allocate any blocks */ FI_NO_ALLOC, /* should not allocate any blocks */
......
...@@ -147,6 +147,7 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) ...@@ -147,6 +147,7 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
} else { } else {
/* if there is no written node page, write its inode page */ /* if there is no written node page, write its inode page */
while (!sync_node_pages(sbi, inode->i_ino, &wbc)) { while (!sync_node_pages(sbi, inode->i_ino, &wbc)) {
mark_inode_dirty_sync(inode);
ret = f2fs_write_inode(inode, NULL); ret = f2fs_write_inode(inode, NULL);
if (ret) if (ret)
goto out; goto out;
......
...@@ -192,6 +192,7 @@ void update_inode(struct inode *inode, struct page *node_page) ...@@ -192,6 +192,7 @@ void update_inode(struct inode *inode, struct page *node_page)
set_cold_node(inode, node_page); set_cold_node(inode, node_page);
set_page_dirty(node_page); set_page_dirty(node_page);
clear_inode_flag(F2FS_I(inode), FI_DIRTY_INODE);
} }
int update_inode_page(struct inode *inode) int update_inode_page(struct inode *inode)
...@@ -217,6 +218,9 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) ...@@ -217,6 +218,9 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
inode->i_ino == F2FS_META_INO(sbi)) inode->i_ino == F2FS_META_INO(sbi))
return 0; return 0;
if (!is_inode_flag_set(F2FS_I(inode), FI_DIRTY_INODE))
return 0;
if (wbc) if (wbc)
f2fs_balance_fs(sbi); f2fs_balance_fs(sbi);
......
...@@ -112,6 +112,17 @@ static int f2fs_drop_inode(struct inode *inode) ...@@ -112,6 +112,17 @@ static int f2fs_drop_inode(struct inode *inode)
return generic_drop_inode(inode); return generic_drop_inode(inode);
} }
/*
* f2fs_dirty_inode() is called from __mark_inode_dirty()
*
* We should call set_dirty_inode to write the dirty inode through write_inode.
*/
static void f2fs_dirty_inode(struct inode *inode, int flags)
{
set_inode_flag(F2FS_I(inode), FI_DIRTY_INODE);
return;
}
static void f2fs_i_callback(struct rcu_head *head) static void f2fs_i_callback(struct rcu_head *head)
{ {
struct inode *inode = container_of(head, struct inode, i_rcu); struct inode *inode = container_of(head, struct inode, i_rcu);
...@@ -249,6 +260,7 @@ static struct super_operations f2fs_sops = { ...@@ -249,6 +260,7 @@ static struct super_operations f2fs_sops = {
.drop_inode = f2fs_drop_inode, .drop_inode = f2fs_drop_inode,
.destroy_inode = f2fs_destroy_inode, .destroy_inode = f2fs_destroy_inode,
.write_inode = f2fs_write_inode, .write_inode = f2fs_write_inode,
.dirty_inode = f2fs_dirty_inode,
.show_options = f2fs_show_options, .show_options = f2fs_show_options,
.evict_inode = f2fs_evict_inode, .evict_inode = f2fs_evict_inode,
.put_super = f2fs_put_super, .put_super = f2fs_put_super,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment