f2fs: avoid freqeunt write_inode calls
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Mon, 10 Jun 2013 00:17:01 +0000 (09:17 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Fri, 14 Jun 2013 00:04:43 +0000 (09:04 +0900)
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>
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/inode.c
fs/f2fs/super.c

index 27edf59ac12cd2b2c724e262a49533a341641eda..a05aa65cfc2c4e644be06fef9a96ae773167c069 100644 (file)
@@ -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 */
index 2f649b8485219fa3470d7e1632d36092baf7e31a..fda226ff1849c324507231ef37551ef4a2dcece4 100644 (file)
@@ -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;
index b44a4c1194eae3777fd7630fae217f1c82da706b..2b2d45d19e3ea1e1101ff893a2ce9e0f19e607ea 100644 (file)
@@ -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);
 
index 4fdcdff45e6a10b093477d2c73b7ab9ccd0bdf5e..ba56549bb2f35173d2dbc668f4ee1843b14db6ee 100644 (file)
@@ -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,