OSDN Git Service

f2fs: remove syncing inode page in all the cases
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 20 May 2016 23:32:49 +0000 (16:32 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 3 Jun 2016 01:05:12 +0000 (18:05 -0700)
This patch reduces to call them across the whole tree.
- sync_inode_page()
- update_inode_page()
- update_inode()
- f2fs_write_inode()

Instead, checkpoint will flush all the dirty inode metadata before syncing
node pages.
Note that, this is doable, since we call mark_inode_dirty_sync() for all
inode's field change which needs to update on-disk inode as well.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c
fs/f2fs/dir.c
fs/f2fs/extent_cache.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/inline.c
fs/f2fs/namei.c
fs/f2fs/node.c
fs/f2fs/recovery.c
fs/f2fs/xattr.c

index 6a4c60c..a3dea51 100644 (file)
@@ -343,8 +343,6 @@ int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
 
        if (set_page_dirty(dn->node_page))
                dn->node_changed = true;
-
-       sync_inode_page(dn);
        return 0;
 }
 
@@ -562,11 +560,8 @@ struct page *get_new_data_page(struct inode *inode,
        }
 got_it:
        if (new_i_size && i_size_read(inode) <
-                               ((loff_t)(index + 1) << PAGE_SHIFT)) {
+                               ((loff_t)(index + 1) << PAGE_SHIFT))
                f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT));
-               /* Only the directory inode sets new_i_size */
-               set_inode_flag(inode, FI_UPDATE_DIR);
-       }
        return page;
 }
 
@@ -787,8 +782,6 @@ skip:
        else if (dn.ofs_in_node < end_offset)
                goto next_block;
 
-       if (allocated)
-               sync_inode_page(&dn);
        f2fs_put_dnode(&dn);
 
        if (create) {
@@ -799,8 +792,6 @@ skip:
        goto next_dnode;
 
 sync_out:
-       if (allocated)
-               sync_inode_page(&dn);
        f2fs_put_dnode(&dn);
 unlock_out:
        if (create) {
index 384d51c..24d1308 100644 (file)
@@ -454,19 +454,15 @@ void update_parent_metadata(struct inode *dir, struct inode *inode,
                                                unsigned int current_depth)
 {
        if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) {
-               if (S_ISDIR(inode->i_mode)) {
+               if (S_ISDIR(inode->i_mode))
                        f2fs_i_links_write(dir, true);
-                       set_inode_flag(dir, FI_UPDATE_DIR);
-               }
                clear_inode_flag(inode, FI_NEW_INODE);
        }
        dir->i_mtime = dir->i_ctime = CURRENT_TIME;
        mark_inode_dirty_sync(dir);
 
-       if (F2FS_I(dir)->i_current_depth != current_depth) {
+       if (F2FS_I(dir)->i_current_depth != current_depth)
                f2fs_i_depth_write(dir, current_depth);
-               set_inode_flag(dir, FI_UPDATE_DIR);
-       }
 
        if (inode && is_inode_flag_set(inode, FI_INC_LINK))
                clear_inode_flag(inode, FI_INC_LINK);
@@ -595,9 +591,7 @@ add_dentry:
        set_page_dirty(dentry_page);
 
        if (inode) {
-               /* we don't need to mark_inode_dirty now */
                f2fs_i_pino_write(inode, dir->i_ino);
-               update_inode(inode, page);
                f2fs_put_page(page, 1);
        }
 
@@ -606,10 +600,6 @@ fail:
        if (inode)
                up_write(&F2FS_I(inode)->i_sem);
 
-       if (is_inode_flag_set(dir, FI_UPDATE_DIR)) {
-               update_inode_page(dir);
-               clear_inode_flag(dir, FI_UPDATE_DIR);
-       }
        kunmap(dentry_page);
        f2fs_put_page(dentry_page, 1);
 
@@ -656,8 +646,6 @@ int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)
                err = PTR_ERR(page);
                goto fail;
        }
-       /* we don't need to mark_inode_dirty now */
-       update_inode(inode, page);
        f2fs_put_page(page, 1);
 
        clear_inode_flag(inode, FI_NEW_INODE);
@@ -673,13 +661,8 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
 
        down_write(&F2FS_I(inode)->i_sem);
 
-       if (S_ISDIR(inode->i_mode)) {
+       if (S_ISDIR(inode->i_mode))
                f2fs_i_links_write(dir, false);
-               if (page)
-                       update_inode(dir, page);
-               else
-                       update_inode_page(dir);
-       }
        inode->i_ctime = CURRENT_TIME;
 
        f2fs_i_links_write(inode, false);
@@ -688,7 +671,6 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
                f2fs_i_size_write(inode, 0);
        }
        up_write(&F2FS_I(inode)->i_sem);
-       update_inode_page(inode);
 
        if (inode->i_nlink == 0)
                add_orphan_inode(sbi, inode->i_ino);
index d21dda6..e858869 100644 (file)
@@ -689,9 +689,7 @@ void f2fs_update_extent_cache(struct dnode_of_data *dn)
 
        fofs = start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) +
                                                                dn->ofs_in_node;
-
-       if (f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, 1))
-               sync_inode_page(dn);
+       f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, 1);
 }
 
 void f2fs_update_extent_cache_range(struct dnode_of_data *dn,
@@ -701,8 +699,7 @@ void f2fs_update_extent_cache_range(struct dnode_of_data *dn,
        if (!f2fs_may_extent_tree(dn->inode))
                return;
 
-       if (f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, len))
-               sync_inode_page(dn);
+       f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, len);
 }
 
 void init_extent_cache_info(struct f2fs_sb_info *sbi)
index b541164..2adef0e 100644 (file)
@@ -1521,7 +1521,6 @@ enum {
        FI_ACL_MODE,            /* indicate acl mode */
        FI_NO_ALLOC,            /* should not allocate any blocks */
        FI_FREE_NID,            /* free allocated nide */
-       FI_UPDATE_DIR,          /* should update inode block for consistency */
        FI_NO_EXTENT,           /* not to use the extent cache */
        FI_INLINE_XATTR,        /* used for inline xattr */
        FI_INLINE_DATA,         /* used for inline data*/
@@ -1936,7 +1935,6 @@ struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *);
 void ra_node_page(struct f2fs_sb_info *, nid_t);
 struct page *get_node_page(struct f2fs_sb_info *, pgoff_t);
 struct page *get_node_page_ra(struct page *, int);
-void sync_inode_page(struct dnode_of_data *);
 void move_node_page(struct page *, int);
 int fsync_node_pages(struct f2fs_sb_info *, nid_t, struct writeback_control *,
                                                                bool);
index c5606b1..73bc946 100644 (file)
@@ -173,12 +173,8 @@ static void try_to_fix_pino(struct inode *inode)
                        get_parent_ino(inode, &pino)) {
                f2fs_i_pino_write(inode, pino);
                file_got_pino(inode);
-               up_write(&fi->i_sem);
-
-               f2fs_write_inode(inode, NULL);
-       } else {
-               up_write(&fi->i_sem);
        }
+       up_write(&fi->i_sem);
 }
 
 static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
@@ -499,7 +495,6 @@ int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
                                                        dn->inode) + ofs;
                f2fs_update_extent_cache_range(dn, fofs, 0, len);
                dec_valid_block_count(sbi, dn->inode, nr_free);
-               sync_inode_page(dn);
        }
        dn->ofs_in_node = ofs;
 
@@ -1123,10 +1118,8 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
        }
 
 out:
-       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) {
+       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
                f2fs_i_size_write(inode, new_size);
-               update_inode_page(inode);
-       }
 
        return ret;
 }
@@ -1232,10 +1225,8 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
                new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end;
        }
 
-       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) {
+       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
                f2fs_i_size_write(inode, new_size);
-               update_inode_page(inode);
-       }
 
        return ret;
 }
index 4bc025c..77c9c24 100644 (file)
@@ -73,7 +73,7 @@ bool truncate_inline_inode(struct page *ipage, u64 from)
 
        f2fs_wait_on_page_writeback(ipage, NODE, true);
        memset(addr + from, 0, MAX_INLINE_DATA - from);
-
+       set_page_dirty(ipage);
        return true;
 }
 
@@ -146,7 +146,6 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
 clear_out:
        stat_dec_inline_inode(dn->inode);
        f2fs_clear_inline_inode(dn->inode);
-       sync_inode_page(dn);
        f2fs_put_dnode(dn);
        return 0;
 }
@@ -212,11 +211,11 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)
        dst_addr = inline_data_addr(dn.inode_page);
        memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
        kunmap_atomic(src_addr);
+       set_page_dirty(dn.inode_page);
 
        set_inode_flag(inode, FI_APPEND_WRITE);
        set_inode_flag(inode, FI_DATA_EXIST);
 
-       sync_inode_page(&dn);
        clear_inline_node(dn.inode_page);
        f2fs_put_dnode(&dn);
        return 0;
@@ -255,7 +254,7 @@ process_inline:
                set_inode_flag(inode, FI_INLINE_DATA);
                set_inode_flag(inode, FI_DATA_EXIST);
 
-               update_inode(inode, ipage);
+               set_page_dirty(ipage);
                f2fs_put_page(ipage, 1);
                return true;
        }
@@ -266,7 +265,6 @@ process_inline:
                if (!truncate_inline_inode(ipage, 0))
                        return false;
                f2fs_clear_inline_inode(inode);
-               update_inode(inode, ipage);
                f2fs_put_page(ipage, 1);
        } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
                if (truncate_blocks(inode, 0, false))
@@ -339,10 +337,8 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,
        set_page_dirty(ipage);
 
        /* update i_size to MAX_INLINE_DATA */
-       if (i_size_read(inode) < MAX_INLINE_DATA) {
+       if (i_size_read(inode) < MAX_INLINE_DATA)
                f2fs_i_size_write(inode, MAX_INLINE_DATA);
-               set_inode_flag(inode, FI_UPDATE_DIR);
-       }
        return 0;
 }
 
@@ -401,12 +397,8 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
        clear_inode_flag(dir, FI_INLINE_DENTRY);
 
        f2fs_i_depth_write(dir, 1);
-       if (i_size_read(dir) < PAGE_SIZE) {
+       if (i_size_read(dir) < PAGE_SIZE)
                f2fs_i_size_write(dir, PAGE_SIZE);
-               set_inode_flag(dir, FI_UPDATE_DIR);
-       }
-
-       sync_inode_page(&dn);
 out:
        f2fs_put_page(page, 1);
        return err;
@@ -486,7 +478,6 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
 
        stat_dec_inline_dir(dir);
        clear_inode_flag(dir, FI_INLINE_DENTRY);
-       update_inode(dir, ipage);
        kfree(backup_dentry);
        return 0;
 recover:
@@ -494,7 +485,7 @@ recover:
        memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
        f2fs_i_depth_write(dir, 0);
        f2fs_i_size_write(dir, MAX_INLINE_DATA);
-       update_inode(dir, ipage);
+       set_page_dirty(ipage);
        f2fs_put_page(ipage, 1);
 
        kfree(backup_dentry);
@@ -559,7 +550,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
        /* we don't need to mark_inode_dirty now */
        if (inode) {
                f2fs_i_pino_write(inode, dir->i_ino);
-               update_inode(inode, page);
                f2fs_put_page(page, 1);
        }
 
@@ -567,11 +557,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
 fail:
        if (inode)
                up_write(&F2FS_I(inode)->i_sem);
-
-       if (is_inode_flag_set(dir, FI_UPDATE_DIR)) {
-               update_inode(dir, ipage);
-               clear_inode_flag(dir, FI_UPDATE_DIR);
-       }
 out:
        f2fs_put_page(ipage, 1);
        return err;
index f2b2c40..496f4e3 100644 (file)
@@ -706,9 +706,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
                        add_orphan_inode(sbi, new_inode->i_ino);
                else
                        release_orphan_inode(sbi);
-
-               update_inode_page(old_inode);
-               update_inode_page(new_inode);
        } else {
                f2fs_balance_fs(sbi, true);
 
@@ -720,10 +717,8 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
                        goto out_whiteout;
                }
 
-               if (old_dir_entry) {
+               if (old_dir_entry)
                        f2fs_i_links_write(new_dir, true);
-                       update_inode_page(new_dir);
-               }
 
                /*
                 * old entry and new entry can locate in the same inline
@@ -771,13 +766,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
                if (old_dir != new_dir && !whiteout) {
                        f2fs_set_link(old_inode, old_dir_entry,
                                                old_dir_page, new_dir);
-                       update_inode_page(old_inode);
                } else {
                        f2fs_dentry_kunmap(old_inode, old_dir_page);
                        f2fs_put_page(old_dir_page, 0);
                }
                f2fs_i_links_write(old_dir, false);
-               update_inode_page(old_dir);
        }
 
        f2fs_unlock_op(sbi);
@@ -899,8 +892,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
        file_lost_pino(old_inode);
        up_write(&F2FS_I(old_inode)->i_sem);
 
-       update_inode_page(old_inode);
-
        old_dir->i_ctime = CURRENT_TIME;
        if (old_nlink) {
                down_write(&F2FS_I(old_dir)->i_sem);
@@ -908,7 +899,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
                up_write(&F2FS_I(old_dir)->i_sem);
        }
        mark_inode_dirty_sync(old_dir);
-       update_inode_page(old_dir);
 
        /* update directory entry info of new dir inode */
        f2fs_set_link(new_dir, new_entry, new_page, old_inode);
@@ -917,8 +907,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
        file_lost_pino(new_inode);
        up_write(&F2FS_I(new_inode)->i_sem);
 
-       update_inode_page(new_inode);
-
        new_dir->i_ctime = CURRENT_TIME;
        if (new_nlink) {
                down_write(&F2FS_I(new_dir)->i_sem);
@@ -926,7 +914,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
                up_write(&F2FS_I(new_dir)->i_sem);
        }
        mark_inode_dirty_sync(new_dir);
-       update_inode_page(new_dir);
 
        f2fs_unlock_op(sbi);
 
index 1965351..82f0f83 100644 (file)
@@ -671,8 +671,6 @@ static void truncate_node(struct dnode_of_data *dn)
                remove_orphan_inode(sbi, dn->nid);
                dec_valid_inode_count(sbi);
                f2fs_inode_synced(dn->inode);
-       } else {
-               sync_inode_page(dn);
        }
 invalidate:
        clear_node_page_dirty(dn->node_page);
@@ -1050,14 +1048,8 @@ struct page *new_node_page(struct dnode_of_data *dn,
        if (f2fs_has_xattr_block(ofs))
                f2fs_i_xnid_write(dn->inode, dn->nid);
 
-       dn->node_page = page;
-       if (ipage)
-               update_inode(dn->inode, ipage);
-       else
-               sync_inode_page(dn);
        if (ofs == 0)
                inc_valid_inode_count(sbi);
-
        return page;
 
 fail:
@@ -1176,24 +1168,6 @@ struct page *get_node_page_ra(struct page *parent, int start)
        return __get_node_page(sbi, nid, parent, start);
 }
 
-void sync_inode_page(struct dnode_of_data *dn)
-{
-       int ret = 0;
-
-       if (IS_INODE(dn->node_page) || dn->inode_page == dn->node_page) {
-               ret = update_inode(dn->inode, dn->node_page);
-       } else if (dn->inode_page) {
-               if (!dn->inode_page_locked)
-                       lock_page(dn->inode_page);
-               ret = update_inode(dn->inode, dn->inode_page);
-               if (!dn->inode_page_locked)
-                       unlock_page(dn->inode_page);
-       } else {
-               ret = update_inode_page(dn->inode);
-       }
-       dn->node_changed = ret ? true: false;
-}
-
 static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
 {
        struct inode *inode;
@@ -2003,8 +1977,6 @@ recover_xnid:
        /* 3: update xattr blkaddr */
        refresh_sit_entry(sbi, NEW_ADDR, blkaddr);
        set_node_addr(sbi, &ni, blkaddr, false);
-
-       update_inode_page(inode);
 }
 
 int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
index 2500b6a..68c433f 100644 (file)
@@ -490,9 +490,6 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
                }
        }
 
-       if (IS_INODE(dn.node_page))
-               sync_inode_page(&dn);
-
        copy_node_footer(dn.node_page, page);
        fill_node_footer(dn.node_page, dn.nid, ni.ino,
                                        ofs_of_node(page), false);
index 1fe6366..8c0a3b3 100644 (file)
@@ -299,6 +299,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
                if (ipage) {
                        inline_addr = inline_xattr_addr(ipage);
                        f2fs_wait_on_page_writeback(ipage, NODE, true);
+                       set_page_dirty(ipage);
                } else {
                        page = get_node_page(sbi, inode->i_ino);
                        if (IS_ERR(page)) {
@@ -546,11 +547,6 @@ static int __f2fs_setxattr(struct inode *inode, int index,
        if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
                        !strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
                f2fs_set_encrypted_inode(inode);
-
-       if (ipage)
-               update_inode(inode, ipage);
-       else
-               update_inode_page(inode);
        mark_inode_dirty_sync(inode);
 exit:
        kzfree(base_addr);