summaryrefslogtreecommitdiff
path: root/patches.tizen/0493-f2fs-avoid-freqeunt-write_inode-calls.patch
diff options
context:
space:
mode:
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.patch96
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
+