diff options
Diffstat (limited to 'patches.tizen/0493-f2fs-avoid-freqeunt-write_inode-calls.patch')
-rw-r--r-- | patches.tizen/0493-f2fs-avoid-freqeunt-write_inode-calls.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/patches.tizen/0493-f2fs-avoid-freqeunt-write_inode-calls.patch b/patches.tizen/0493-f2fs-avoid-freqeunt-write_inode-calls.patch new file mode 100644 index 00000000000..e97593cb628 --- /dev/null +++ b/patches.tizen/0493-f2fs-avoid-freqeunt-write_inode-calls.patch @@ -0,0 +1,96 @@ +From f447b34c9af60ca5f0a0586a51107794a9dbb6c5 Mon Sep 17 00:00:00 2001 +From: Jaegeuk Kim <jaegeuk.kim@samsung.com> +Date: Mon, 10 Jun 2013 09:17:01 +0900 +Subject: [PATCH 0493/1302] 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: Jaegeuk Kim <jaegeuk.kim@samsung.com> +Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com> +--- + fs/f2fs/f2fs.h | 1 + + fs/f2fs/file.c | 1 + + fs/f2fs/inode.c | 4 ++++ + fs/f2fs/super.c | 12 ++++++++++++ + 4 files changed, 18 insertions(+) + +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 27edf59..a05aa65 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -856,6 +856,7 @@ static inline int f2fs_clear_bit(unsigned int nr, char *addr) + /* used for f2fs_inode_info->flags */ + enum { + 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_ACL_MODE, /* indicate acl mode */ + FI_NO_ALLOC, /* should not allocate any blocks */ +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 2f649b8..fda226f 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -147,6 +147,7 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) + } else { + /* if there is no written node page, write its inode page */ + while (!sync_node_pages(sbi, inode->i_ino, &wbc)) { ++ mark_inode_dirty_sync(inode); + ret = f2fs_write_inode(inode, NULL); + if (ret) + goto out; +diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c +index b44a4c1..2b2d45d1 100644 +--- a/fs/f2fs/inode.c ++++ b/fs/f2fs/inode.c +@@ -192,6 +192,7 @@ void update_inode(struct inode *inode, struct page *node_page) + + set_cold_node(inode, node_page); + set_page_dirty(node_page); ++ clear_inode_flag(F2FS_I(inode), FI_DIRTY_INODE); + } + + int update_inode_page(struct inode *inode) +@@ -217,6 +218,9 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) + inode->i_ino == F2FS_META_INO(sbi)) + return 0; + ++ if (!is_inode_flag_set(F2FS_I(inode), FI_DIRTY_INODE)) ++ return 0; ++ + if (wbc) + f2fs_balance_fs(sbi); + +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 4fdcdff..ba56549 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -112,6 +112,17 @@ static int f2fs_drop_inode(struct 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) + { + struct inode *inode = container_of(head, struct inode, i_rcu); +@@ -249,6 +260,7 @@ static struct super_operations f2fs_sops = { + .drop_inode = f2fs_drop_inode, + .destroy_inode = f2fs_destroy_inode, + .write_inode = f2fs_write_inode, ++ .dirty_inode = f2fs_dirty_inode, + .show_options = f2fs_show_options, + .evict_inode = f2fs_evict_inode, + .put_super = f2fs_put_super, +-- +1.8.3.2 + |