f2fs: use inode pointer for {set, clear}_inode_flag
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/12 f2fs: use inode pointer for {set, clear}_inode_flag
This patch refactors to use inode pointer for set_inode_flag and clear_inode_flag.
--- fs/f2fs/acl.c | 7 ++--- fs/f2fs/checkpoint.c | 15 ++++------ fs/f2fs/data.c | 21 +++++++------- fs/f2fs/dir.c | 22 +++++++-------- fs/f2fs/extent_cache.c | 6 ++-- fs/f2fs/f2fs.h | 74 ++++++++++++++++++++++++-------------------------- fs/f2fs/file.c | 58 ++++++++++++++++++--------------------- fs/f2fs/gc.c | 4 +-- fs/f2fs/inline.c | 25 ++++++++--------- fs/f2fs/inode.c | 29 ++++++++++---------- fs/f2fs/namei.c | 22 +++++++++------ fs/f2fs/node.c | 4 +-- fs/f2fs/segment.c | 2 +- fs/f2fs/segment.h | 2 +- fs/f2fs/super.c | 7 +---- fs/f2fs/xattr.c | 7 ++--- 16 files changed, 145 insertions(+), 160 deletions(-)
fs/f2fs/acl.c +3 -4
@@ -201,7 +201,6 @@ struct posix_acl *f2fs_get_acl(struct inode *inode, int type)static int __f2fs_set_acl (struct inode *inode,int type,struct posix_acl *acl,struct page *ipage) { -struct f2fs_inode_info *fi =F2FS_I (inode);int name_index;void *value =NULL ;size_t size =0 ;
@@ -214,7 +213,7 @@ static int __f2fs_set_acl(struct inode *inode, int type, error =posix_acl_equiv_mode (acl, &inode->i_mode);if (error <0 )return error; -set_acl_inode (fi, inode->i_mode); +set_acl_inode (inode, inode->i_mode);if (error ==0 ) acl =NULL ; }
@@ -233,7 +232,7 @@ static int __f2fs_set_acl(struct inode *inode, int type,if (acl) { value =f2fs_acl_to_disk (acl, &size);if (IS_ERR (value)) { -clear_inode_flag (fi,FI_ACL_MODE ); +clear_inode_flag (inode,FI_ACL_MODE );return (int )PTR_ERR (value); } }
@@ -244,7 +243,7 @@ static int __f2fs_set_acl(struct inode *inode, int type,if (!error)set_cached_acl (inode, type, acl); -clear_inode_flag (fi,FI_ACL_MODE ); +clear_inode_flag (inode,FI_ACL_MODE );return error; }
fs/f2fs/checkpoint.c +6 -9
@@ -759,28 +759,25 @@ fail_no_cp:static void __add_dirty_inode (struct inode *inode,enum inode_type type) {struct f2fs_sb_info *sbi =F2FS_I_SB (inode); -struct f2fs_inode_info *fi =F2FS_I (inode);int flag = (type ==DIR_INODE ) ?FI_DIRTY_DIR :FI_DIRTY_FILE ; -if (is_inode_flag_set (fi, flag)) +if (is_inode_flag_set (inode, flag))return ; -set_inode_flag (fi, flag); -list_add_tail (&fi->dirty_list, &sbi->inode_list[type]); +set_inode_flag (inode, flag); +list_add_tail (&F2FS_I (inode)->dirty_list, &sbi->inode_list[type]);stat_inc_dirty_inode (sbi, type); }static void __remove_dirty_inode (struct inode *inode,enum inode_type type) { -struct f2fs_inode_info *fi =F2FS_I (inode);int flag = (type ==DIR_INODE ) ?FI_DIRTY_DIR :FI_DIRTY_FILE ; -if (get_dirty_pages (inode) || - !is_inode_flag_set (F2FS_I (inode), flag)) +if (get_dirty_pages (inode) || !is_inode_flag_set (inode, flag))return ; -list_del_init (&fi->dirty_list); -clear_inode_flag (fi, flag); +list_del_init (&F2FS_I (inode)->dirty_list); +clear_inode_flag (inode, flag);stat_dec_dirty_inode (F2FS_I_SB (inode), type); }
fs/f2fs/data.c +10 -11
@@ -321,7 +321,7 @@ int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)if (!count)return 0 ; -if (unlikely (is_inode_flag_set (F2FS_I (dn->inode),FI_NO_ALLOC ))) +if (unlikely (is_inode_flag_set (dn->inode,FI_NO_ALLOC )))return -EPERM ;if (unlikely (!inc_valid_block_count (sbi, dn->inode, &count)))return -ENOSPC ;
@@ -566,7 +566,7 @@ got_it: ((loff_t)(index + 1) << PAGE_SHIFT)) {i_size_write (inode, ((loff_t)(index +1 ) <<PAGE_SHIFT ));/* Only the directory inode sets new_i_size */ -set_inode_flag (F2FS_I (inode),FI_UPDATE_DIR ); +set_inode_flag (inode,FI_UPDATE_DIR ); }return page; }
@@ -580,7 +580,7 @@ static int __allocate_data_block(struct dnode_of_data *dn)pgoff_t fofs;blkcnt_t count =1 ; -if (unlikely (is_inode_flag_set (F2FS_I (dn->inode),FI_NO_ALLOC ))) +if (unlikely (is_inode_flag_set (dn->inode,FI_NO_ALLOC )))return -EPERM ; dn->data_blkaddr =datablock_addr (dn->node_page, dn->ofs_in_node);
@@ -717,8 +717,7 @@ next_block: }else { err =__allocate_data_block (&dn);if (!err) { -set_inode_flag (F2FS_I (inode), -FI_APPEND_WRITE ); +set_inode_flag (inode,FI_APPEND_WRITE ); allocated = true; } }
@@ -1193,14 +1192,14 @@ retry_encrypt: !IS_ATOMIC_WRITTEN_PAGE(page) && need_inplace_update(inode))) { rewrite_data_page(fio); - set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE); + set_inode_flag(inode, FI_UPDATE_WRITE); trace_f2fs_do_write_data_page(page, IPU); } else {write_data_page (&dn, fio);trace_f2fs_do_write_data_page (page,OPU ); -set_inode_flag (F2FS_I (inode),FI_APPEND_WRITE ); +set_inode_flag (inode,FI_APPEND_WRITE );if (page->index ==0 ) -set_inode_flag (F2FS_I (inode),FI_FIRST_BLOCK_WRITTEN ); +set_inode_flag (inode,FI_FIRST_BLOCK_WRITTEN ); } out_writepage:f2fs_put_dnode (&dn);
@@ -1469,7 +1468,7 @@ static int f2fs_write_data_pages(struct address_space *mapping, goto skip_write;/* skip writing during file defragment */ -if (is_inode_flag_set (F2FS_I (inode),FI_DO_DEFRAG )) +if (is_inode_flag_set (inode,FI_DO_DEFRAG )) goto skip_write;/* during POR, we don't need to trigger writepage at all. */
@@ -1549,7 +1548,7 @@ restart:if (f2fs_has_inline_data (inode)) {if (pos + len <=MAX_INLINE_DATA ) {read_inline_data (page, ipage); -set_inode_flag (F2FS_I (inode),FI_DATA_EXIST ); +set_inode_flag (inode,FI_DATA_EXIST );if (inode->i_nlink)set_inline_node (ipage); }else {
@@ -1756,7 +1755,7 @@ static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) err =blockdev_direct_IO (iocb, inode, iter, get_data_block_dio);if (iov_iter_rw (iter) ==WRITE ) {if (err >0 ) -set_inode_flag (F2FS_I (inode),FI_UPDATE_WRITE ); +set_inode_flag (inode,FI_UPDATE_WRITE );else if (err <0 )f2fs_write_failed (mapping, offset + count); }
fs/f2fs/dir.c +11 -11
@@ -385,7 +385,7 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,struct page *page;int err; -if (is_inode_flag_set (F2FS_I (inode),FI_NEW_INODE )) { +if (is_inode_flag_set (inode,FI_NEW_INODE )) { page =new_inode_page (inode);if (IS_ERR (page))return page;
@@ -429,7 +429,7 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,* This file should be checkpointed during fsync. * We lost i_pino from now on. */ -if (is_inode_flag_set (F2FS_I (inode),FI_INC_LINK )) { +if (is_inode_flag_set (inode,FI_INC_LINK )) {file_lost_pino (inode);/* * If link the tmpfile to alias through linkat path,
@@ -454,23 +454,23 @@ put_error:void update_parent_metadata (struct inode *dir,struct inode *inode,unsigned int current_depth) { -if (inode &&is_inode_flag_set (F2FS_I (inode),FI_NEW_INODE )) { +if (inode &&is_inode_flag_set (inode,FI_NEW_INODE )) {if (S_ISDIR (inode->i_mode)) {inc_nlink (dir); -set_inode_flag (F2FS_I (dir),FI_UPDATE_DIR ); +set_inode_flag (dir,FI_UPDATE_DIR ); } -clear_inode_flag (F2FS_I (inode),FI_NEW_INODE ); +clear_inode_flag (inode,FI_NEW_INODE ); } dir->i_mtime = dir->i_ctime =CURRENT_TIME ;mark_inode_dirty (dir);if (F2FS_I (dir)->i_current_depth != current_depth) {F2FS_I (dir)->i_current_depth = current_depth; -set_inode_flag (F2FS_I (dir),FI_UPDATE_DIR ); +set_inode_flag (dir,FI_UPDATE_DIR ); } -if (inode &&is_inode_flag_set (F2FS_I (inode),FI_INC_LINK )) -clear_inode_flag (F2FS_I (inode),FI_INC_LINK ); +if (inode &&is_inode_flag_set (inode,FI_INC_LINK )) +clear_inode_flag (inode,FI_INC_LINK ); }int room_for_filename (const void *bitmap,int slots,int max_slots)
@@ -607,9 +607,9 @@ fail:if (inode)up_write (&F2FS_I (inode)->i_sem); -if (is_inode_flag_set (F2FS_I (dir),FI_UPDATE_DIR )) { +if (is_inode_flag_set (dir,FI_UPDATE_DIR )) {update_inode_page (dir); -clear_inode_flag (F2FS_I (dir),FI_UPDATE_DIR ); +clear_inode_flag (dir,FI_UPDATE_DIR ); }kunmap (dentry_page);f2fs_put_page (dentry_page,1 );
@@ -661,7 +661,7 @@ int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)update_inode (inode, page);f2fs_put_page (page,1 ); -clear_inode_flag (F2FS_I (inode),FI_NEW_INODE ); +clear_inode_flag (inode,FI_NEW_INODE ); fail:up_write (&F2FS_I (inode)->i_sem);f2fs_update_time (F2FS_I_SB (inode),REQ_TIME );
fs/f2fs/extent_cache.c +3 -3
@@ -431,7 +431,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,write_lock (&et->lock); -if (is_inode_flag_set (F2FS_I (inode),FI_NO_EXTENT )) { +if (is_inode_flag_set (inode,FI_NO_EXTENT )) {write_unlock (&et->lock);return false; }
@@ -523,11 +523,11 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode, prev.len < F2FS_MIN_EXTENT_LEN && et->largest.len < F2FS_MIN_EXTENT_LEN) { et->largest.len =0 ; -set_inode_flag (F2FS_I (inode),FI_NO_EXTENT ); +set_inode_flag (inode,FI_NO_EXTENT ); } } -if (is_inode_flag_set (F2FS_I (inode),FI_NO_EXTENT )) +if (is_inode_flag_set (inode,FI_NO_EXTENT ))__free_extent_tree (sbi, et);write_unlock (&et->lock);
fs/f2fs/f2fs.h +36 -38
164 lines not on this page · raw message
fs/f2fs/file.c +27 -31
191 lines not on this page · raw message
fs/f2fs/gc.c +2 -2
@@ -617,9 +617,9 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)f2fs_submit_page_mbio (&fio);f2fs_update_data_blkaddr (&dn, newaddr); -set_inode_flag (F2FS_I (inode),FI_APPEND_WRITE ); +set_inode_flag (inode,FI_APPEND_WRITE );if (page->index ==0 ) -set_inode_flag (F2FS_I (inode),FI_FIRST_BLOCK_WRITTEN ); +set_inode_flag (inode,FI_FIRST_BLOCK_WRITTEN ); put_page_out:f2fs_put_page (fio.encrypted_page,1 ); recover_block:
fs/f2fs/inline.c +12 -13
@@ -138,7 +138,7 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)inode_dec_dirty_pages (dn->inode);/* this converted inline_data should be recovered. */ -set_inode_flag (F2FS_I (dn->inode),FI_APPEND_WRITE ); +set_inode_flag (dn->inode,FI_APPEND_WRITE );/* clear inline data and flag after data writeback */ truncate_inline_inode (dn->inode_page,0 );
@@ -213,8 +213,8 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)memcpy (dst_addr, src_addr,MAX_INLINE_DATA );kunmap_atomic (src_addr); -set_inode_flag (F2FS_I (inode),FI_APPEND_WRITE ); -set_inode_flag (F2FS_I (inode),FI_DATA_EXIST ); +set_inode_flag (inode,FI_APPEND_WRITE ); +set_inode_flag (inode,FI_DATA_EXIST );sync_inode_page (&dn);clear_inline_node (dn.inode_page);
@@ -252,8 +252,8 @@ process_inline: dst_addr =inline_data_addr (ipage);memcpy (dst_addr, src_addr,MAX_INLINE_DATA ); -set_inode_flag (F2FS_I (inode),FI_INLINE_DATA ); -set_inode_flag (F2FS_I (inode),FI_DATA_EXIST ); +set_inode_flag (inode,FI_INLINE_DATA ); +set_inode_flag (inode,FI_DATA_EXIST );update_inode (inode, ipage);f2fs_put_page (ipage,1 );
@@ -341,7 +341,7 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,/* update i_size to MAX_INLINE_DATA */ if (i_size_read (inode) <MAX_INLINE_DATA ) {i_size_write (inode,MAX_INLINE_DATA ); -set_inode_flag (F2FS_I (inode),FI_UPDATE_DIR ); +set_inode_flag (inode,FI_UPDATE_DIR ); }return 0 ; }
@@ -398,12 +398,12 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,truncate_inline_inode (ipage,0 );stat_dec_inline_dir (dir); -clear_inode_flag (F2FS_I (dir),FI_INLINE_DENTRY ); +clear_inode_flag (dir,FI_INLINE_DENTRY );F2FS_I (dir)->i_current_depth =1 ;if (i_size_read (dir) <PAGE_SIZE ) {i_size_write (dir,PAGE_SIZE ); -set_inode_flag (F2FS_I (dir),FI_UPDATE_DIR ); +set_inode_flag (dir,FI_UPDATE_DIR ); }sync_inode_page (&dn);
@@ -464,7 +464,6 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage, struct f2fs_inline_dentry *inline_dentry) {struct f2fs_inline_dentry *backup_dentry; -struct f2fs_inode_info *fi =F2FS_I (dir);int err; backup_dentry = f2fs_kmalloc(sizeof(struct f2fs_inline_dentry),
@@ -486,14 +485,14 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,lock_page (ipage);stat_dec_inline_dir (dir); -clear_inode_flag (fi,FI_INLINE_DENTRY ); +clear_inode_flag (dir,FI_INLINE_DENTRY );update_inode (dir, ipage);kfree (backup_dentry);return 0 ; recover:lock_page (ipage);memcpy (inline_dentry, backup_dentry,MAX_INLINE_DATA ); - fi->i_current_depth =0 ; +F2FS_I (dir)->i_current_depth =0 ;i_size_write (dir,MAX_INLINE_DATA );update_inode (dir, ipage);f2fs_put_page (ipage,1 );
@@ -569,9 +568,9 @@ fail:if (inode)up_write (&F2FS_I (inode)->i_sem); -if (is_inode_flag_set (F2FS_I (dir),FI_UPDATE_DIR )) { +if (is_inode_flag_set (dir,FI_UPDATE_DIR )) {update_inode (dir, ipage); -clear_inode_flag (F2FS_I (dir),FI_UPDATE_DIR ); +clear_inode_flag (dir,FI_UPDATE_DIR ); } out:f2fs_put_page (ipage,1 );
fs/f2fs/inode.c +14 -15
@@ -85,8 +85,8 @@ static void __recover_inline_status(struct inode *inode, struct page *ipage)if (*start++) {f2fs_wait_on_page_writeback (ipage,NODE , true); -set_inode_flag (F2FS_I (inode),FI_DATA_EXIST ); -set_raw_inline (F2FS_I (inode),F2FS_INODE (ipage)); +set_inode_flag (inode,FI_DATA_EXIST ); +set_raw_inline (inode,F2FS_INODE (ipage));set_page_dirty (ipage);return ; }
@@ -141,7 +141,7 @@ static int do_read_inode(struct inode *inode)if (f2fs_init_extent_tree (inode, &ri->i_ext))set_page_dirty (node_page); -get_inline_info (fi, ri); +get_inline_info (inode, ri);/* check data exist */ if (f2fs_has_inline_data (inode) && !f2fs_exist_data (inode))
@@ -151,7 +151,7 @@ static int do_read_inode(struct inode *inode)__get_inode_rdev (inode, ri);if (__written_first_block (ri)) -set_inode_flag (F2FS_I (inode),FI_FIRST_BLOCK_WRITTEN ); +set_inode_flag (inode,FI_FIRST_BLOCK_WRITTEN );f2fs_put_page (node_page,1 );
@@ -244,7 +244,7 @@ int update_inode(struct inode *inode, struct page *node_page) &ri->i_ext); else memset(&ri->i_ext, 0, sizeof(ri->i_ext)); -set_raw_inline (F2FS_I (inode), ri); +set_raw_inline (inode, ri); ri->i_atime =cpu_to_le64 (inode->i_atime.tv_sec); ri->i_ctime =cpu_to_le64 (inode->i_ctime.tv_sec);
@@ -261,7 +261,7 @@ int update_inode(struct inode *inode, struct page *node_page)__set_inode_rdev (inode, ri);set_cold_node (inode, node_page); -clear_inode_flag (F2FS_I (inode),FI_DIRTY_INODE ); +clear_inode_flag (inode,FI_DIRTY_INODE );/* deleted inode */ if (inode->i_nlink ==0 )
@@ -300,7 +300,7 @@ 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 )) +if (!is_inode_flag_set (inode,FI_DIRTY_INODE ))return 0 ;/*
@@ -318,8 +318,7 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)void f2fs_evict_inode (struct inode *inode) {struct f2fs_sb_info *sbi =F2FS_I_SB (inode); -struct f2fs_inode_info *fi =F2FS_I (inode); -nid_t xnid = fi->i_xattr_nid; +nid_t xnid =F2FS_I (inode)->i_xattr_nid;int err =0 ;/* some remained atomic pages should discarded */
@@ -342,7 +341,7 @@ void f2fs_evict_inode(struct inode *inode) goto no_delete;sb_start_intwrite (inode->i_sb); -set_inode_flag (fi,FI_NO_ALLOC ); +set_inode_flag (inode,FI_NO_ALLOC );i_size_write (inode,0 ); retry:if (F2FS_HAS_BLOCKS (inode))
@@ -369,13 +368,13 @@ no_delete:invalidate_mapping_pages (NODE_MAPPING (sbi), inode->i_ino, inode->i_ino);if (xnid)invalidate_mapping_pages (NODE_MAPPING (sbi), xnid, xnid); -if (is_inode_flag_set (fi,FI_APPEND_WRITE )) +if (is_inode_flag_set (inode,FI_APPEND_WRITE ))add_ino_entry (sbi, inode->i_ino,APPEND_INO ); -if (is_inode_flag_set (fi,FI_UPDATE_WRITE )) +if (is_inode_flag_set (inode,FI_UPDATE_WRITE ))add_ino_entry (sbi, inode->i_ino,UPDATE_INO ); -if (is_inode_flag_set (fi,FI_FREE_NID )) { +if (is_inode_flag_set (inode,FI_FREE_NID )) {alloc_nid_failed (sbi, inode->i_ino); -clear_inode_flag (fi,FI_FREE_NID ); +clear_inode_flag (inode,FI_FREE_NID ); }f2fs_bug_on (sbi, err && !exist_written_data (sbi, inode->i_ino,ORPHAN_INO ));
@@ -411,7 +410,7 @@ void handle_failed_inode(struct inode *inode) }alloc_nid_done (sbi, inode->i_ino); }else { -set_inode_flag (F2FS_I (inode),FI_FREE_NID ); +set_inode_flag (inode,FI_FREE_NID ); }f2fs_unlock_op (sbi);
fs/f2fs/namei.c +13 -9
@@ -60,10 +60,14 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)if (f2fs_encrypted_inode (dir) &&f2fs_may_encrypt (inode))f2fs_set_encrypted_inode (inode); +set_inode_flag (inode,FI_NEW_INODE ); + +if (test_opt (sbi,INLINE_XATTR )) +set_inode_flag (inode,FI_INLINE_XATTR );if (test_opt (sbi,INLINE_DATA ) &&f2fs_may_inline_data (inode)) -set_inode_flag (F2FS_I (inode),FI_INLINE_DATA ); +set_inode_flag (inode,FI_INLINE_DATA );if (f2fs_may_inline_dentry (inode)) -set_inode_flag (F2FS_I (inode),FI_INLINE_DENTRY ); +set_inode_flag (inode,FI_INLINE_DENTRY );f2fs_init_extent_tree (inode,NULL );
@@ -79,7 +83,7 @@ fail:trace_f2fs_new_inode (inode, err);make_bad_inode (inode);if (nid_free) -set_inode_flag (F2FS_I (inode),FI_FREE_NID ); +set_inode_flag (inode,FI_FREE_NID );iput (inode);return ERR_PTR (err); }
@@ -177,7 +181,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, inode->i_ctime =CURRENT_TIME ;ihold (inode); -set_inode_flag (F2FS_I (inode),FI_INC_LINK ); +set_inode_flag (inode,FI_INC_LINK );f2fs_lock_op (sbi); err =f2fs_add_link (dentry, inode);if (err)
@@ -190,7 +194,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,f2fs_sync_fs (sbi->sb,1 );return 0 ; out: -clear_inode_flag (F2FS_I (inode),FI_INC_LINK ); +clear_inode_flag (inode,FI_INC_LINK );iput (inode);f2fs_unlock_op (sbi);return err;
@@ -244,7 +248,7 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino) } out:if (!err) { -clear_inode_flag (F2FS_I (dir),FI_INLINE_DOTS ); +clear_inode_flag (dir,FI_INLINE_DOTS );mark_inode_dirty (dir); }
@@ -492,7 +496,7 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)f2fs_balance_fs (sbi, true); -set_inode_flag (F2FS_I (inode),FI_INC_LINK ); +set_inode_flag (inode,FI_INC_LINK );f2fs_lock_op (sbi); err =f2fs_add_link (dentry, inode);if (err)
@@ -509,7 +513,7 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)return 0 ; out_fail: -clear_inode_flag (F2FS_I (inode),FI_INC_LINK ); +clear_inode_flag (inode,FI_INC_LINK );handle_failed_inode (inode);return err; }
@@ -763,7 +767,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,if (whiteout) { whiteout->i_state |=I_LINKABLE ; -set_inode_flag (F2FS_I (whiteout),FI_INC_LINK ); +set_inode_flag (whiteout,FI_INC_LINK ); err =f2fs_add_link (old_dentry, whiteout);if (err) goto put_out_dir;
fs/f2fs/node.c +2 -2
@@ -1019,7 +1019,7 @@ struct page *new_node_page(struct dnode_of_data *dn,struct page *page;int err; -if (unlikely (is_inode_flag_set (F2FS_I (dn->inode),FI_NO_ALLOC ))) +if (unlikely (is_inode_flag_set (dn->inode,FI_NO_ALLOC )))return ERR_PTR (-EPERM ); page =f2fs_grab_cache_page (NODE_MAPPING (sbi), dn->nid, false);
@@ -1955,7 +1955,7 @@ void recover_inline_xattr(struct inode *inode, struct page *page) ri =F2FS_INODE (page);if (!(ri->i_inline &F2FS_INLINE_XATTR )) { -clear_inode_flag (F2FS_I (inode),FI_INLINE_XATTR ); +clear_inode_flag (inode,FI_INLINE_XATTR ); goto update_inode; }
fs/f2fs/segment.c +1 -1
@@ -241,7 +241,7 @@ void drop_inmem_pages(struct inode *inode) {struct f2fs_inode_info *fi =F2FS_I (inode); -clear_inode_flag (F2FS_I (inode),FI_ATOMIC_FILE ); +clear_inode_flag (inode,FI_ATOMIC_FILE );mutex_lock (&fi->inmem_lock);__revoke_inmem_pages (inode, &fi->inmem_pages, true, false);
fs/f2fs/segment.h +1 -1
@@ -544,7 +544,7 @@ static inline bool need_inplace_update(struct inode *inode)/* this is only set during fdatasync */ if (policy & (0x1 <<F2FS_IPU_FSYNC ) && -is_inode_flag_set (F2FS_I (inode),FI_NEED_IPU )) +is_inode_flag_set (inode,FI_NEED_IPU ))return true;return false;
fs/f2fs/super.c +1 -6
@@ -540,11 +540,6 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)INIT_LIST_HEAD (&fi->inmem_pages);mutex_init (&fi->inmem_lock); -set_inode_flag (fi,FI_NEW_INODE ); - -if (test_opt (F2FS_SB (sb),INLINE_XATTR )) -set_inode_flag (fi,FI_INLINE_XATTR ); -/* Will be used by directory only */ fi->i_dir_level =F2FS_SB (sb)->dir_level;return &fi->vfs_inode;
@@ -596,7 +591,7 @@ static int f2fs_drop_inode(struct inode *inode)*/ static void f2fs_dirty_inode (struct inode *inode,int flags) { -set_inode_flag (F2FS_I (inode),FI_DIRTY_INODE ); +set_inode_flag (inode,FI_DIRTY_INODE ); }static void f2fs_i_callback (struct rcu_head *head)
fs/f2fs/xattr.c +3 -4
@@ -441,7 +441,6 @@ static int __f2fs_setxattr(struct inode *inode, int index, const char *name, const void *value, size_t size, struct page *ipage, int flags) { - struct f2fs_inode_info *fi = F2FS_I(inode); struct f2fs_xattr_entry *here, *last;void *base_addr;int found, newsize;
@@ -539,10 +538,10 @@ static int __f2fs_setxattr(struct inode *inode, int index,if (error) goto exit; -if (is_inode_flag_set (fi,FI_ACL_MODE )) { - inode->i_mode = fi->i_acl_mode; +if (is_inode_flag_set (inode,FI_ACL_MODE )) { + inode->i_mode =F2FS_I (inode)->i_acl_mode; inode->i_ctime =CURRENT_TIME ; -clear_inode_flag (fi,FI_ACL_MODE ); +clear_inode_flag (inode,FI_ACL_MODE ); }if (index ==F2FS_XATTR_INDEX_ENCRYPTION && !strcmp (name,F2FS_XATTR_NAME_ENCRYPTION_CONTEXT ))
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 2/12 f2fs: introduce f2fs_i_size_write with mark_inode_dirty_sync
This patch introduces f2fs_i_size_write() to call mark_inode_dirty_sync() with i_size_write().
--- fs/f2fs/data.c | 10 ++++------ fs/f2fs/dir.c | 2 +- fs/f2fs/f2fs.h | 6 ++++++ fs/f2fs/file.c | 10 ++++------ fs/f2fs/inline.c | 6 +++--- fs/f2fs/recovery.c | 2 +- fs/f2fs/super.c | 2 +- 7 files changed, 20 insertions(+), 18 deletions(-)
fs/f2fs/data.c +4 -6
@@ -564,7 +564,7 @@ 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 )) { -i_size_write (inode, ((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 ); }
@@ -605,7 +605,7 @@ alloc: fofs =start_bidx_of_node (ofs_of_node (dn->node_page), dn->inode) + dn->ofs_in_node;if (i_size_read (dn->inode) < ((loff_t)(fofs +1 ) <<PAGE_SHIFT )) -i_size_write (dn->inode, +f2fs_i_size_write (dn->inode, ((loff_t)(fofs +1 ) <<PAGE_SHIFT ));return 0 ; }
@@ -1711,10 +1711,8 @@ static int f2fs_write_end(struct file *file,set_page_dirty (page); -if (pos + copied >i_size_read (inode)) { -i_size_write (inode, pos + copied); -mark_inode_dirty (inode); - } +if (pos + copied >i_size_read (inode)) +f2fs_i_size_write (inode, pos + copied);f2fs_put_page (page,1 );f2fs_update_time (F2FS_I_SB (inode),REQ_TIME );
fs/f2fs/dir.c +1 -1
@@ -686,7 +686,7 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)drop_nlink (inode);if (S_ISDIR (inode->i_mode)) {drop_nlink (inode); -i_size_write (inode,0 ); +f2fs_i_size_write (inode,0 ); }up_write (&F2FS_I (inode)->i_sem);update_inode_page (inode);
fs/f2fs/f2fs.h +6 -0
@@ -1556,6 +1556,12 @@ static inline void set_acl_inode(struct inode *inode, umode_t mode)set_inode_flag (inode,FI_ACL_MODE ); } +static inline void f2fs_i_size_write (struct inode *inode,loff_t i_size) +{ +i_size_write (inode, i_size); +mark_inode_dirty_sync (inode); +} +static inline void get_inline_info (struct inode *inode,struct f2fs_inode *ri) {if (ri->i_inline &F2FS_INLINE_XATTR )
fs/f2fs/file.c +4 -6
@@ -988,7 +988,7 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len) ret =truncate_blocks (inode, new_size, true);if (!ret) -i_size_write (inode, new_size); +f2fs_i_size_write (inode, new_size);return ret; }
@@ -1125,8 +1125,7 @@ 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) { -i_size_write (inode, new_size); -mark_inode_dirty (inode); +f2fs_i_size_write (inode, new_size);update_inode_page (inode); }
@@ -1186,7 +1185,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)truncate_pagecache (inode, offset);if (!ret) -i_size_write (inode, new_size); +f2fs_i_size_write (inode, new_size);return ret; }
@@ -1235,8 +1234,7 @@ static int expand_inode_data(struct inode *inode, loff_t offset, }if (!(mode &FALLOC_FL_KEEP_SIZE ) &&i_size_read (inode) < new_size) { -i_size_write (inode, new_size); -mark_inode_dirty (inode); +f2fs_i_size_write (inode, new_size);update_inode_page (inode); }
fs/f2fs/inline.c +3 -3
@@ -340,7 +340,7 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,/* update i_size to MAX_INLINE_DATA */ if (i_size_read (inode) <MAX_INLINE_DATA ) { -i_size_write (inode,MAX_INLINE_DATA ); +f2fs_i_size_write (inode,MAX_INLINE_DATA );set_inode_flag (inode,FI_UPDATE_DIR ); }return 0 ;
@@ -402,7 +402,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,F2FS_I (dir)->i_current_depth =1 ;if (i_size_read (dir) <PAGE_SIZE ) { -i_size_write (dir,PAGE_SIZE ); +f2fs_i_size_write (dir,PAGE_SIZE );set_inode_flag (dir,FI_UPDATE_DIR ); }
@@ -493,7 +493,7 @@ recover:lock_page (ipage);memcpy (inline_dentry, backup_dentry,MAX_INLINE_DATA );F2FS_I (dir)->i_current_depth =0 ; -i_size_write (dir,MAX_INLINE_DATA ); +f2fs_i_size_write (dir,MAX_INLINE_DATA );update_inode (dir, ipage);f2fs_put_page (ipage,1 );
fs/f2fs/recovery.c +1 -1
@@ -175,7 +175,7 @@ static void recover_inode(struct inode *inode, struct page *page)char *name; inode->i_mode =le16_to_cpu (raw->i_mode); -i_size_write (inode,le64_to_cpu (raw->i_size)); +f2fs_i_size_write (inode,le64_to_cpu (raw->i_size)); inode->i_atime.tv_sec =le64_to_cpu (raw->i_mtime); inode->i_ctime.tv_sec =le64_to_cpu (raw->i_ctime); inode->i_mtime.tv_sec =le64_to_cpu (raw->i_mtime);
fs/f2fs/super.c +1 -1
@@ -568,7 +568,7 @@ static int f2fs_drop_inode(struct inode *inode)f2fs_destroy_extent_node (inode);sb_start_intwrite (inode->i_sb); -i_size_write (inode,0 ); +f2fs_i_size_write (inode,0 );if (F2FS_HAS_BLOCKS (inode))f2fs_truncate (inode, true);
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 3/12 f2fs: introduce f2fs_i_blocks_write with mark_inode_dirty_sync
In reply to Jaegeuk KimThis patch introduces f2fs_i_blocks_write() to call mark_inode_dirty_sync() when changing inode->i_blocks.
--- fs/f2fs/data.c | 1 - fs/f2fs/f2fs.h | 17 +++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-)
fs/f2fs/data.c +0 -1
@@ -344,7 +344,6 @@ int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)if (set_page_dirty (dn->node_page)) dn->node_changed = true; -mark_inode_dirty (dn->inode);sync_inode_page (dn);return 0 ; }
fs/f2fs/f2fs.h +13 -4
@@ -1119,6 +1119,7 @@ static inline bool f2fs_has_xattr_block(unsigned int ofs)return ofs ==XATTR_NODE_OFFSET ; } +static inline void f2fs_i_blocks_write (struct inode *,blkcnt_t ,bool );static inline bool inc_valid_block_count (struct f2fs_sb_info *sbi,struct inode *inode,blkcnt_t *count) {
@@ -1141,7 +1142,7 @@ static inline bool inc_valid_block_count(struct f2fs_sb_info *sbi, } }/* *count can be recalculated */ - inode->i_blocks += *count; +f2fs_i_blocks_write (inode, *count, true); sbi->total_valid_block_count = sbi->total_valid_block_count + (block_t)(*count);spin_unlock (&sbi->stat_lock);
@@ -1157,7 +1158,7 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi,spin_lock (&sbi->stat_lock);f2fs_bug_on (sbi, sbi->total_valid_block_count < (block_t ) count);f2fs_bug_on (sbi, inode->i_blocks < count); - inode->i_blocks -= count; +f2fs_i_blocks_write (inode, count, false); sbi->total_valid_block_count -= (block_t )count;spin_unlock (&sbi->stat_lock); }
@@ -1294,7 +1295,7 @@ static inline bool inc_valid_node_count(struct f2fs_sb_info *sbi, }if (inode) - inode->i_blocks++; +f2fs_i_blocks_write (inode,1 , true); sbi->total_valid_node_count++; sbi->total_valid_block_count++;
@@ -1313,7 +1314,7 @@ static inline void dec_valid_node_count(struct f2fs_sb_info *sbi,f2fs_bug_on (sbi, !sbi->total_valid_node_count);f2fs_bug_on (sbi, !inode->i_blocks); - inode->i_blocks--; +f2fs_i_blocks_write (inode,1 , false); sbi->total_valid_node_count--; sbi->total_valid_block_count--;
@@ -1556,6 +1557,14 @@ static inline void set_acl_inode(struct inode *inode, umode_t mode)set_inode_flag (inode,FI_ACL_MODE ); } +static inline void f2fs_i_blocks_write (struct inode *inode, +blkcnt_t diff,bool add) +{ + inode->i_blocks = add ? inode->i_blocks + diff : + inode->i_blocks - diff; +mark_inode_dirty_sync (inode); +} +static inline void f2fs_i_size_write (struct inode *inode,loff_t i_size) {i_size_write (inode, i_size);
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 4/12 f2fs: introduce f2fs_i_links_write with mark_inode_dirty_sync
In reply to Jaegeuk KimThis patch introduces f2fs_i_links_write() to call mark_inode_dirty_sync() when changing inode->i_links.
--- fs/f2fs/checkpoint.c | 1 + fs/f2fs/dir.c | 10 +++++----- fs/f2fs/f2fs.h | 9 +++++++++ fs/f2fs/namei.c | 24 ++++++------------------ 4 files changed, 21 insertions(+), 23 deletions(-)
fs/f2fs/checkpoint.c +1 -0
@@ -535,6 +535,7 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) }clear_nlink (inode); +mark_inode_dirty_sync (inode);/* truncate all the data during iput */ iput (inode);
fs/f2fs/dir.c +5 -5
@@ -437,7 +437,7 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,*/ if (inode->i_nlink ==0 )remove_orphan_inode (F2FS_I_SB (dir), inode->i_ino); -inc_nlink (inode); +f2fs_i_links_write (inode, true); }return page;
@@ -456,7 +456,7 @@ void update_parent_metadata(struct inode *dir, struct inode *inode, {if (inode &&is_inode_flag_set (inode,FI_NEW_INODE )) {if (S_ISDIR (inode->i_mode)) { -inc_nlink (dir); +f2fs_i_links_write (dir, true);set_inode_flag (dir,FI_UPDATE_DIR ); }clear_inode_flag (inode,FI_NEW_INODE );
@@ -675,7 +675,7 @@ 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)) { -drop_nlink (dir); +f2fs_i_links_write (dir, false);if (page)update_inode (dir, page);else
@@ -683,9 +683,9 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page) } inode->i_ctime =CURRENT_TIME ; -drop_nlink (inode); +f2fs_i_links_write (inode, false);if (S_ISDIR (inode->i_mode)) { -drop_nlink (inode); +f2fs_i_links_write (inode, false);f2fs_i_size_write (inode,0 ); }up_write (&F2FS_I (inode)->i_sem);
fs/f2fs/f2fs.h +9 -0
@@ -1557,6 +1557,15 @@ static inline void set_acl_inode(struct inode *inode, umode_t mode)set_inode_flag (inode,FI_ACL_MODE ); } +static inline void f2fs_i_links_write (struct inode *inode,bool inc) +{ +if (inc) +inc_nlink (inode); +else +drop_nlink (inode); +mark_inode_dirty_sync (inode); +} +static inline void f2fs_i_blocks_write (struct inode *inode,blkcnt_t diff,bool add) {
fs/f2fs/namei.c +6 -18
@@ -349,9 +349,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)f2fs_delete_entry (de, page, dir, inode);f2fs_unlock_op (sbi); -/* In order to evict this inode, we set it dirty */ -mark_inode_dirty (inode); -if (IS_DIRSYNC (dir))f2fs_sync_fs (sbi->sb,1 ); fail:
@@ -704,12 +701,10 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, new_inode->i_ctime =CURRENT_TIME ;down_write (&F2FS_I (new_inode)->i_sem);if (old_dir_entry) -drop_nlink (new_inode); -drop_nlink (new_inode); +f2fs_i_links_write (new_inode, false); +f2fs_i_links_write (new_inode, false);up_write (&F2FS_I (new_inode)->i_sem); -mark_inode_dirty (new_inode); -if (!new_inode->i_nlink)add_orphan_inode (sbi, new_inode->i_ino);else
@@ -729,7 +724,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, }if (old_dir_entry) { -inc_nlink (new_dir); +f2fs_i_links_write (new_dir, true);update_inode_page (new_dir); }
@@ -784,8 +779,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,f2fs_dentry_kunmap (old_inode, old_dir_page);f2fs_put_page (old_dir_page,0 ); } -drop_nlink (old_dir); -mark_inode_dirty (old_dir); +f2fs_i_links_write (old_dir, false);update_inode_page (old_dir); }
@@ -913,10 +907,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, old_dir->i_ctime =CURRENT_TIME ;if (old_nlink) {down_write (&F2FS_I (old_dir)->i_sem); -if (old_nlink <0 ) -drop_nlink (old_dir); -else -inc_nlink (old_dir); +f2fs_i_links_write (old_dir, old_nlink >0 );up_write (&F2FS_I (old_dir)->i_sem); }mark_inode_dirty (old_dir);
@@ -934,10 +925,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, new_dir->i_ctime =CURRENT_TIME ;if (new_nlink) {down_write (&F2FS_I (new_dir)->i_sem); -if (new_nlink <0 ) -drop_nlink (new_dir); -else -inc_nlink (new_dir); +f2fs_i_links_write (new_dir, new_nlink >0 );up_write (&F2FS_I (new_dir)->i_sem); }mark_inode_dirty (new_dir);
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 5/12 f2fs: call mark_inode_dirty_sync for i_field changes
In reply to Jaegeuk KimThis patch calls mark_inode_dirty_sync() for the following on-disk inode changes.
-> largest
-> ctime/mtime/atime
-> i_current_depth
-> i_xattr_nid
-> i_pino
-> i_advise
-> flags
--- fs/f2fs/dir.c | 14 ++++++------- fs/f2fs/extent_cache.c | 24 ++++++++++++--------- fs/f2fs/f2fs.h | 57 +++++++++++++++++++++++++++++++++++++++++++------- fs/f2fs/file.c | 11 +++++----- fs/f2fs/inline.c | 7 ++++--- fs/f2fs/namei.c | 11 ++++------ fs/f2fs/node.c | 6 +++--- fs/f2fs/xattr.c | 3 ++- 8 files changed, 88 insertions(+), 45 deletions(-)
fs/f2fs/dir.c +7 -7
@@ -243,8 +243,7 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,"Corrupted max_depth of %lu: %u" , dir->i_ino, max_depth); max_depth =MAX_DIR_HASH_DEPTH ; -F2FS_I (dir)->i_current_depth = max_depth; -mark_inode_dirty (dir); +f2fs_i_depth_write (dir, max_depth); }for (level =0 ; level < max_depth; level++) {
@@ -303,9 +302,9 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,set_de_type (de, inode->i_mode);f2fs_dentry_kunmap (dir, page);set_page_dirty (page); - dir->i_mtime = dir->i_ctime =CURRENT_TIME ; -mark_inode_dirty (dir); + dir->i_mtime = dir->i_ctime =CURRENT_TIME ; +mark_inode_dirty_sync (dir);f2fs_put_page (page,1 ); }
@@ -462,10 +461,10 @@ void update_parent_metadata(struct inode *dir, struct inode *inode,clear_inode_flag (inode,FI_NEW_INODE ); } dir->i_mtime = dir->i_ctime =CURRENT_TIME ; -mark_inode_dirty (dir); +mark_inode_dirty_sync (dir);if (F2FS_I (dir)->i_current_depth != current_depth) { -F2FS_I (dir)->i_current_depth = current_depth; +f2fs_i_depth_write (dir, current_depth);set_inode_flag (dir,FI_UPDATE_DIR ); }
@@ -597,7 +596,7 @@ add_dentry:if (inode) {/* we don't need to mark_inode_dirty now */ -F2FS_I (inode)->i_pino = dir->i_ino; +f2fs_i_pino_write (inode, dir->i_ino);update_inode (inode, page);f2fs_put_page (page,1 ); }
@@ -730,6 +729,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,set_page_dirty (page); dir->i_ctime = dir->i_mtime =CURRENT_TIME ; +mark_inode_dirty_sync (dir);if (inode)f2fs_drop_nlink (dir, inode,NULL );
fs/f2fs/extent_cache.c +14 -10
@@ -170,8 +170,10 @@ static void __drop_largest_extent(struct inode *inode, {struct extent_info *largest = &F2FS_I (inode)->extent_tree->largest; -if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs) +if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs) { largest->len =0 ; +mark_inode_dirty_sync (inode); + } }/* return true, if inode page is changed */
@@ -335,11 +337,12 @@ lookup_neighbors:return en; } -static struct extent_node *__try_merge_extent_node (struct f2fs_sb_info *sbi, +static struct extent_node *__try_merge_extent_node (struct inode *inode,struct extent_tree *et,struct extent_info *ei,struct extent_node *prev_ex,struct extent_node *next_ex) { +struct f2fs_sb_info *sbi =F2FS_I_SB (inode);struct extent_node *en =NULL ;if (prev_ex &&__is_back_mergeable (ei, &prev_ex->ei)) {
@@ -360,7 +363,7 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,if (!en)return NULL ; -__try_update_largest_extent (et, en); +__try_update_largest_extent (inode, et, en);spin_lock (&sbi->extent_lock);if (!list_empty (&en->list)) {
@@ -371,11 +374,12 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,return en; } -static struct extent_node *__insert_extent_tree (struct f2fs_sb_info *sbi, +static struct extent_node *__insert_extent_tree (struct inode *inode,struct extent_tree *et,struct extent_info *ei,struct rb_node **insert_p,struct rb_node *insert_parent) { +struct f2fs_sb_info *sbi =F2FS_I_SB (inode);struct rb_node **p = &et->root.rb_node;struct rb_node *parent =NULL ;struct extent_node *en =NULL ;
@@ -402,7 +406,7 @@ do_insert:if (!en)return NULL ; -__try_update_largest_extent (et, en); +__try_update_largest_extent (inode, et, en);/* update in global extent list */ spin_lock (&sbi->extent_lock);
@@ -473,7 +477,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,set_extent_info (&ei, end, end - dei.fofs + dei.blk, org_end - end); - en1 =__insert_extent_tree (sbi, et, &ei, + en1 =__insert_extent_tree (inode, et, &ei,NULL ,NULL ); next_en = en1; }else {
@@ -494,7 +498,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode, }if (parts) -__try_update_largest_extent (et, en); +__try_update_largest_extent (inode, et, en);else __release_extent_node (sbi, et, en);
@@ -514,15 +518,15 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,if (blkaddr) {set_extent_info (&ei, fofs, blkaddr, len); -if (!__try_merge_extent_node (sbi, et, &ei, prev_en, next_en)) -__insert_extent_tree (sbi, et, &ei, +if (!__try_merge_extent_node (inode, et, &ei, prev_en, next_en)) +__insert_extent_tree (inode, et, &ei, insert_p, insert_parent);/* give up extent_cache, if split and small updates happen */ if (dei.len >=1 && prev.len <F2FS_MIN_EXTENT_LEN && et->largest.len <F2FS_MIN_EXTENT_LEN ) { - et->largest.len =0 ; +__drop_largest_extent (inode,0 ,UINT_MAX );set_inode_flag (inode,FI_NO_EXTENT ); } }
fs/f2fs/f2fs.h +49 -8
105 lines not on this page · raw message
fs/f2fs/file.c +5 -6
@@ -171,11 +171,10 @@ static void try_to_fix_pino(struct inode *inode) fi->xattr_ver =0 ;if (file_wrong_pino (inode) && inode->i_nlink ==1 &&get_parent_ino (inode, &pino)) { - fi->i_pino = pino; +f2fs_i_pino_write (inode, pino);file_got_pino (inode);up_write (&fi->i_sem); -mark_inode_dirty_sync (inode);f2fs_write_inode (inode,NULL ); }else {up_write (&fi->i_sem);
@@ -636,7 +635,7 @@ int f2fs_truncate(struct inode *inode, bool lock)return err; inode->i_mtime = inode->i_ctime =CURRENT_TIME ; -mark_inode_dirty (inode); +mark_inode_dirty_sync (inode);return 0 ; }
@@ -726,7 +725,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) } } -mark_inode_dirty (inode); +mark_inode_dirty_sync (inode);return err; }
@@ -1279,7 +1278,7 @@ static long f2fs_fallocate(struct file *file, int mode,if (!ret) { inode->i_mtime = inode->i_ctime =CURRENT_TIME ; -mark_inode_dirty (inode); +mark_inode_dirty_sync (inode);f2fs_update_time (F2FS_I_SB (inode),REQ_TIME ); }
@@ -1372,7 +1371,7 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)f2fs_set_inode_flags (inode); inode->i_ctime =CURRENT_TIME ; -mark_inode_dirty (inode); +mark_inode_dirty_sync (inode); out:mnt_drop_write_file (filp);return ret;
fs/f2fs/inline.c +4 -3
@@ -400,7 +400,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,stat_dec_inline_dir (dir);clear_inode_flag (dir,FI_INLINE_DENTRY ); -F2FS_I (dir)->i_current_depth =1 ; +f2fs_i_depth_write (dir,1 );if (i_size_read (dir) <PAGE_SIZE ) {f2fs_i_size_write (dir,PAGE_SIZE );set_inode_flag (dir,FI_UPDATE_DIR );
@@ -492,7 +492,7 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage, recover:lock_page (ipage);memcpy (inline_dentry, backup_dentry,MAX_INLINE_DATA ); -F2FS_I (dir)->i_current_depth =0 ; +f2fs_i_depth_write (dir,0 );f2fs_i_size_write (dir,MAX_INLINE_DATA );update_inode (dir, ipage);f2fs_put_page (ipage,1 );
@@ -558,7 +558,7 @@ 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 (inode)->i_pino = dir->i_ino; +f2fs_i_pino_write (inode, dir->i_ino);update_inode (inode, page);f2fs_put_page (page,1 ); }
@@ -597,6 +597,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,set_page_dirty (page); dir->i_ctime = dir->i_mtime =CURRENT_TIME ; +mark_inode_dirty_sync (dir);if (inode)f2fs_drop_nlink (dir, inode, page);
fs/f2fs/namei.c +4 -7
@@ -76,7 +76,6 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)stat_inc_inline_dir (inode);trace_f2fs_new_inode (inode,0 ); -mark_inode_dirty (inode);return inode; fail:
@@ -247,10 +246,8 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino) err =__f2fs_add_link (dir, &dotdot,NULL , pino,S_IFDIR ); } out: -if (!err) { +if (!err)clear_inode_flag (dir,FI_INLINE_DOTS ); -mark_inode_dirty (dir); - }f2fs_unlock_op (sbi);return err;
@@ -756,7 +753,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,up_write (&F2FS_I (old_inode)->i_sem); old_inode->i_ctime =CURRENT_TIME ; -mark_inode_dirty (old_inode); +mark_inode_dirty_sync (old_inode);f2fs_delete_entry (old_entry, old_page, old_dir,NULL );
@@ -910,7 +907,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,f2fs_i_links_write (old_dir, old_nlink >0 );up_write (&F2FS_I (old_dir)->i_sem); } -mark_inode_dirty (old_dir); +mark_inode_dirty_sync (old_dir);update_inode_page (old_dir);/* update directory entry info of new dir inode */
@@ -928,7 +925,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,f2fs_i_links_write (new_dir, new_nlink >0 );up_write (&F2FS_I (new_dir)->i_sem); } -mark_inode_dirty (new_dir); +mark_inode_dirty_sync (new_dir);update_inode_page (new_dir);f2fs_unlock_op (sbi);
fs/f2fs/node.c +3 -3
@@ -953,7 +953,7 @@ int truncate_xattr_node(struct inode *inode, struct page *page)if (IS_ERR (npage))return PTR_ERR (npage); -F2FS_I (inode)->i_xattr_nid =0 ; +f2fs_i_xnid_write (inode,0 );/* need to do checkpoint during fsync */ F2FS_I (inode)->xattr_ver =cur_cp_version (F2FS_CKPT (sbi));
@@ -1047,7 +1047,7 @@ struct page *new_node_page(struct dnode_of_data *dn, dn->node_changed = true;if (f2fs_has_xattr_block (ofs)) -F2FS_I (dn->inode)->i_xattr_nid = dn->nid; +f2fs_i_xnid_write (dn->inode, dn->nid); dn->node_page = page;if (ipage)
@@ -1997,7 +1997,7 @@ recover_xnid:get_node_info (sbi, new_xnid, &ni); ni.ino = inode->i_ino;set_node_addr (sbi, &ni,NEW_ADDR , false); -F2FS_I (inode)->i_xattr_nid = new_xnid; +f2fs_i_xnid_write (inode, new_xnid);/* 3: update xattr blkaddr */ refresh_sit_entry (sbi,NEW_ADDR , blkaddr);
fs/f2fs/xattr.c +2 -1
@@ -106,7 +106,7 @@ static int f2fs_xattr_advise_set(const struct xattr_handler *handler,return -EINVAL ;F2FS_I (inode)->i_advise |= *(char *)value; -mark_inode_dirty (inode); +mark_inode_dirty_sync (inode);return 0 ; }
@@ -541,6 +541,7 @@ static int __f2fs_setxattr(struct inode *inode, int index,if (is_inode_flag_set (inode,FI_ACL_MODE )) { inode->i_mode =F2FS_I (inode)->i_acl_mode; inode->i_ctime =CURRENT_TIME ; +mark_inode_dirty_sync (inode);clear_inode_flag (inode,FI_ACL_MODE ); } if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 6/12 f2fs: flush inode metadata when checkpoint is doing
In reply to Jaegeuk KimThis patch registers all the inodes which have dirty metadata to sync when checkpoint is doing.
--- fs/f2fs/checkpoint.c | 36 ++++++++++++++++++++++++++++++++++++ fs/f2fs/debug.c | 5 +++-- fs/f2fs/f2fs.h | 8 ++++++-- fs/f2fs/inode.c | 6 +++++- fs/f2fs/segment.h | 2 ++ fs/f2fs/super.c | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 5 deletions(-)
fs/f2fs/checkpoint.c +36 -0
@@ -860,6 +860,34 @@ retry: goto retry; } +int f2fs_sync_inode_meta (struct f2fs_sb_info *sbi) +{ +struct list_head *head = &sbi->inode_list[DIRTY_META ]; +struct inode *inode; +struct f2fs_inode_info *fi; +s64 total =get_pages (sbi,F2FS_DIRTY_IMETA ); + +while (total--) { +if (unlikely (f2fs_cp_error (sbi))) +return -EIO ; + +spin_lock (&sbi->inode_lock[DIRTY_META ]); +if (list_empty (head)) { +spin_unlock (&sbi->inode_lock[DIRTY_META ]); +return 0 ; + } + fi = list_entry(head->next, struct f2fs_inode_info, + gdirty_list); + inode =igrab (&fi->vfs_inode); +spin_unlock (&sbi->inode_lock[DIRTY_META ]); +if (inode) { +update_inode_page (inode); +iput (inode); + } + }; +return 0 ; +} +/* * Freeze all the FS-operations for checkpoint. */
@@ -886,6 +914,14 @@ retry_flush_dents: goto retry_flush_dents; } +if (get_pages (sbi,F2FS_DIRTY_IMETA )) { +f2fs_unlock_all (sbi); + err =f2fs_sync_inode_meta (sbi); +if (err) + goto out; + goto retry_flush_dents; + } +/* * POR: we should ensure that there are no dirty node pages * until finishing nat/sit flush.
fs/f2fs/debug.c +3 -2
@@ -47,6 +47,7 @@ static void update_general_status(struct f2fs_sb_info *sbi) si->ndirty_data =get_pages (sbi,F2FS_DIRTY_DATA ); si->ndirty_dirs = sbi->ndirty_inode[DIR_INODE ]; si->ndirty_files = sbi->ndirty_inode[FILE_INODE ]; + si->ndirty_all = sbi->ndirty_inode[DIRTY_META ]; si->inmem_pages =get_pages (sbi,F2FS_INMEM_PAGES ); si->wb_bios =atomic_read (&sbi->nr_wb_bios); si->total_count = (int )sbi->user_block_count / sbi->blocks_per_seg;
@@ -304,8 +305,8 @@ static int stat_show(struct seq_file *s, void *v) si->inmem_pages, si->wb_bios);seq_printf (s," - nodes: %4lld in %4d\n" , si->ndirty_node, si->node_pages); -seq_printf (s," - dents: %4lld in dirs:%4d\n" , - si->ndirty_dent, si->ndirty_dirs); +seq_printf (s," - dents: %4lld in dirs:%4d (%4d)\n" , + si->ndirty_dent, si->ndirty_dirs, si->ndirty_all);seq_printf (s," - datas: %4lld in files:%4d\n" , si->ndirty_data, si->ndirty_files); seq_printf(s, " - meta: %4lld in %4d\n",
fs/f2fs/f2fs.h +6 -2
@@ -442,7 +442,8 @@ struct f2fs_inode_info {nid_t i_xattr_nid;/* node id that contains xattrs */ unsigned long long xattr_ver;/* cp version of xattr modification */ -struct list_head dirty_list;/* linked in global dirty list */ +struct list_head dirty_list;/* dirty list for dirs and files */ +struct list_head gdirty_list;/* linked in global dirty list */ struct list_head inmem_pages;/* inmemory pages managed by f2fs */ struct mutex inmem_lock;/* lock for inmemory pages */ struct extent_tree *extent_tree;/* cached extent_tree entry */
@@ -657,6 +658,7 @@ enum count_type {F2FS_DIRTY_NODES ,F2FS_DIRTY_META ,F2FS_INMEM_PAGES , +F2FS_DIRTY_IMETA , NR_COUNT_TYPE, };
@@ -707,6 +709,7 @@ struct f2fs_bio_info {enum inode_type {DIR_INODE ,/* for dirty dir inode */ FILE_INODE ,/* for dirty regular/symlink inode */ +DIRTY_META ,/* for all dirtied inode metadata */ NR_INODE_TYPE , };
@@ -1895,6 +1898,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)/* * super.c */ +void f2fs_inode_synced (struct inode *);int f2fs_commit_super (struct f2fs_sb_info *,bool );int f2fs_sync_fs (struct super_block *,int ); extern __printf(3, 4)
@@ -2074,7 +2078,7 @@ struct f2fs_stat_info {unsigned long long hit_total, total_ext;int ext_tree, zombie_tree, ext_node;s64 ndirty_node, ndirty_dent, ndirty_meta, ndirty_data, inmem_pages; -unsigned int ndirty_dirs, ndirty_files; +unsigned int ndirty_dirs, ndirty_files, ndirty_all;int nats, dirty_nats, sits, dirty_sits, fnids;int total_count, utilization;int bg_gc, wb_bios;
fs/f2fs/inode.c +5 -1
@@ -261,7 +261,7 @@ int update_inode(struct inode *inode, struct page *node_page)__set_inode_rdev (inode, ri);set_cold_node (inode, node_page); -clear_inode_flag (inode,FI_DIRTY_INODE ); +f2fs_inode_synced (inode);/* deleted inode */ if (inode->i_nlink ==0 )
@@ -285,6 +285,7 @@ retry: }else if (err != -ENOENT ) {f2fs_stop_checkpoint (sbi, false); } +f2fs_inode_synced (inode);return 0 ; } ret =update_inode (inode, node_page);
@@ -378,6 +379,9 @@ no_delete: }f2fs_bug_on (sbi, err && !exist_written_data (sbi, inode->i_ino,ORPHAN_INO )); +if (err) +update_inode_page (inode); +f2fs_inode_synced (inode); out_clear:fscrypt_put_encryption_info (inode,NULL );clear_inode (inode);
fs/f2fs/segment.h +2 -0
@@ -479,6 +479,8 @@ static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, int freed)int node_secs =get_blocktype_secs (sbi,F2FS_DIRTY_NODES );int dent_secs =get_blocktype_secs (sbi,F2FS_DIRTY_DENTS ); + node_secs +=get_blocktype_secs (sbi,F2FS_DIRTY_IMETA ); +if (unlikely (is_sbi_flag_set (sbi,SBI_POR_DOING )))return false;
fs/f2fs/super.c +34 -0
@@ -537,6 +537,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) fi->i_advise =0 ;init_rwsem (&fi->i_sem);INIT_LIST_HEAD (&fi->dirty_list); +INIT_LIST_HEAD (&fi->gdirty_list);INIT_LIST_HEAD (&fi->inmem_pages);mutex_init (&fi->inmem_lock);
@@ -591,7 +592,40 @@ static int f2fs_drop_inode(struct inode *inode)*/ static void f2fs_dirty_inode (struct inode *inode,int flags) { +struct f2fs_sb_info *sbi =F2FS_I_SB (inode); + +if (inode->i_ino ==F2FS_NODE_INO (sbi) || + inode->i_ino ==F2FS_META_INO (sbi)) +return ; + +spin_lock (&sbi->inode_lock[DIRTY_META ]); +if (is_inode_flag_set (inode,FI_DIRTY_INODE )) { +spin_unlock (&sbi->inode_lock[DIRTY_META ]); +return ; + } +set_inode_flag (inode,FI_DIRTY_INODE ); +list_add_tail (&F2FS_I (inode)->gdirty_list, + &sbi->inode_list[DIRTY_META ]); +inc_page_count (sbi,F2FS_DIRTY_IMETA ); +spin_unlock (&sbi->inode_lock[DIRTY_META ]); +stat_inc_dirty_inode (sbi,DIRTY_META ); +} + +void f2fs_inode_synced (struct inode *inode) +{ +struct f2fs_sb_info *sbi =F2FS_I_SB (inode); + +spin_lock (&sbi->inode_lock[DIRTY_META ]); +if (!is_inode_flag_set (inode,FI_DIRTY_INODE )) { +spin_unlock (&sbi->inode_lock[DIRTY_META ]); +return ; + } +list_del_init (&F2FS_I (inode)->gdirty_list); +clear_inode_flag (inode,FI_DIRTY_INODE ); +dec_page_count (sbi,F2FS_DIRTY_IMETA ); +spin_unlock (&sbi->inode_lock[DIRTY_META ]); +stat_dec_dirty_inode (F2FS_I_SB (inode),DIRTY_META ); }static void f2fs_i_callback (struct rcu_head *head)
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 7/12 f2fs: remove syncing inode page in all the cases
In reply to Jaegeuk KimThis 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.
--- fs/f2fs/data.c | 11 +---------- fs/f2fs/dir.c | 24 +++--------------------- fs/f2fs/extent_cache.c | 7 ++----- fs/f2fs/f2fs.h | 2 -- fs/f2fs/file.c | 15 +++------------ fs/f2fs/inline.c | 27 ++++++--------------------- fs/f2fs/namei.c | 15 +-------------- fs/f2fs/node.c | 28 ---------------------------- fs/f2fs/recovery.c | 3 --- fs/f2fs/xattr.c | 6 +----- 10 files changed, 17 insertions(+), 121 deletions(-)
fs/f2fs/data.c +1 -10
@@ -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) {
fs/f2fs/dir.c +3 -21
@@ -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);
fs/f2fs/extent_cache.c +2 -5
@@ -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)
fs/f2fs/f2fs.h +0 -2
@@ -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*/
@@ -1932,7 +1931,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 );
fs/f2fs/file.c +3 -12
@@ -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; }
fs/f2fs/inline.c +6 -21
@@ -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;
fs/f2fs/namei.c +1 -14
@@ -706,9 +706,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,add_orphan_inode (sbi, new_inode->i_ino); elserelease_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);
fs/f2fs/node.c +0 -28
@@ -670,8 +670,6 @@ static void truncate_node(struct dnode_of_data *dn)if (dn->nid == dn->inode->i_ino) {remove_orphan_inode (sbi, dn->nid);dec_valid_inode_count (sbi); - }else { -sync_inode_page (dn); } invalidate:clear_node_page_dirty (dn->node_page);
@@ -1049,14 +1047,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:
@@ -1175,24 +1167,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;
@@ -2002,8 +1976,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)
fs/f2fs/recovery.c +0 -3
@@ -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);
fs/f2fs/xattr.c +1 -5
@@ -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)) {
@@ -547,11 +548,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); exit:kzfree (base_addr);return error;
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 8/12 f2fs: avoid unnecessary updating inode during fsync
In reply to Jaegeuk KimIf roll-forward recovery can recover i_size, we don't need to update inode's metadata during fsync.
--- fs/f2fs/data.c | 3 +++ fs/f2fs/f2fs.h | 23 +++++++++++++++++++++-- fs/f2fs/file.c | 4 ++-- fs/f2fs/inode.c | 3 +++ fs/f2fs/node.c | 9 +++++++-- fs/f2fs/recovery.c | 3 +++ fs/f2fs/super.c | 4 ++++ 7 files changed, 43 insertions(+), 6 deletions(-)
fs/f2fs/data.c +3 -0
@@ -1204,6 +1204,7 @@ static int f2fs_write_data_page(struct page *page,loff_t i_size =i_size_read (inode);const pgoff_t end_index = ((unsigned long long ) i_size) >>PAGE_SHIFT ; +loff_t psize = (page->index +1 ) <<PAGE_SHIFT ;unsigned offset =0 ;bool need_balance_fs = false;int err =0 ;
@@ -1265,6 +1266,8 @@ write: err =f2fs_write_inline_data (inode, page);if (err == -EAGAIN ) err =do_write_data_page (&fio); +if (F2FS_I (inode)->last_disk_size < psize) +F2FS_I (inode)->last_disk_size = psize;f2fs_unlock_op (sbi); done:if (err && err != -ENOENT )
fs/f2fs/f2fs.h +21 -2
@@ -441,6 +441,7 @@ struct f2fs_inode_info {unsigned int clevel;/* maximum level of given file name */ nid_t i_xattr_nid;/* node id that contains xattrs */ unsigned long long xattr_ver;/* cp version of xattr modification */ +loff_t last_disk_size;/* lastly written file size */ struct list_head dirty_list;/* dirty list for dirs and files */ struct list_head gdirty_list;/* linked in global dirty list */
@@ -1516,6 +1517,7 @@ static inline void f2fs_change_bit(unsigned int nr, char *addr)enum {FI_NEW_INODE ,/* indicate newly allocated inode */ FI_DIRTY_INODE ,/* indicate inode is dirty or not */ +FI_AUTO_RECOVER ,/* indicate inode is recoverable */ FI_DIRTY_DIR ,/* indicate directory has dirty pages */ FI_INC_LINK ,/* need to increment i_nlink */ FI_ACL_MODE ,/* indicate acl mode */
@@ -1590,15 +1592,32 @@ static inline void f2fs_i_links_write(struct inode *inode, bool inc)static inline void f2fs_i_blocks_write (struct inode *inode,blkcnt_t diff,bool add) { +bool clean = !is_inode_flag_set (inode,FI_DIRTY_INODE ); +bool recover =is_inode_flag_set (inode,FI_AUTO_RECOVER ); + inode->i_blocks = add ? inode->i_blocks + diff : inode->i_blocks - diff;mark_inode_dirty_sync (inode); +if (clean || recover) +set_inode_flag (inode,FI_AUTO_RECOVER ); }static inline void f2fs_i_size_write (struct inode *inode,loff_t i_size) { +bool clean = !is_inode_flag_set (inode,FI_DIRTY_INODE ); +bool recover =is_inode_flag_set (inode,FI_AUTO_RECOVER ); +i_size_write (inode, i_size);mark_inode_dirty_sync (inode); +if (clean || recover) +set_inode_flag (inode,FI_AUTO_RECOVER ); +} + +static inline bool f2fs_skip_inode_update (struct inode *inode) +{ +if (!is_inode_flag_set (inode,FI_AUTO_RECOVER )) +return false; +return F2FS_I (inode)->last_disk_size ==i_size_read (inode); }static inline void f2fs_i_depth_write (struct inode *inode,unsigned int depth)
@@ -1932,8 +1951,8 @@ 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 move_node_page (struct page *,int ); -int fsync_node_pages (struct f2fs_sb_info *,nid_t ,struct writeback_control *, -bool ); +int fsync_node_pages (struct f2fs_sb_info *,struct inode *, +struct writeback_control *,bool );int sync_node_pages (struct f2fs_sb_info *,struct writeback_control *);bool alloc_nid (struct f2fs_sb_info *,nid_t *);void alloc_nid_done (struct f2fs_sb_info *,nid_t );
fs/f2fs/file.c +2 -2
@@ -208,7 +208,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end, }/* if the inode is dirty, let's recover all the time */ -if (!datasync) { +if (!datasync && !f2fs_skip_inode_update (inode)) {f2fs_write_inode (inode,NULL ); goto go_write; }
@@ -251,7 +251,7 @@ go_write: goto out; } sync_nodes: - ret =fsync_node_pages (sbi, ino, &wbc, atomic); + ret =fsync_node_pages (sbi, inode, &wbc, atomic);if (ret) goto out;
fs/f2fs/inode.c +3 -0
@@ -153,6 +153,9 @@ static int do_read_inode(struct inode *inode)if (__written_first_block (ri))set_inode_flag (inode,FI_FIRST_BLOCK_WRITTEN ); +if (!need_inode_block_update (sbi, inode->i_ino)) + fi->last_disk_size = inode->i_size; +f2fs_put_page (node_page,1 );stat_inc_inline_xattr (inode);
fs/f2fs/node.c +7 -2
@@ -1292,7 +1292,7 @@ continue_unlock:return last_page; } -int fsync_node_pages (struct f2fs_sb_info *sbi,nid_t ino, +int fsync_node_pages (struct f2fs_sb_info *sbi,struct inode *inode,struct writeback_control *wbc,bool atomic) {pgoff_t index, end;
@@ -1300,6 +1300,7 @@ int fsync_node_pages(struct f2fs_sb_info *sbi, nid_t ino,int ret =0 ;struct page *last_page =NULL ;bool marked = false; +nid_t ino = inode->i_ino;if (atomic) { last_page =last_fsync_dnode (sbi, ino);
@@ -1353,9 +1354,13 @@ continue_unlock:if (!atomic || page == last_page) {set_fsync_mark (page,1 ); -if (IS_INODE (page)) +if (IS_INODE (page)) { +if (is_inode_flag_set (inode, +FI_DIRTY_INODE )) +update_inode (inode, page);set_dentry_mark (page,need_dentry_mark (sbi, ino)); + }/* may be written by other thread */ if (!PageDirty (page))set_page_dirty (page);
fs/f2fs/recovery.c +3 -0
@@ -455,6 +455,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,continue ; } +if ((start +1 ) <<PAGE_SHIFT >i_size_read (inode)) +f2fs_i_size_write (inode, (start +1 ) <<PAGE_SHIFT ); +/* * dest is reserved block, invalidate src block * and then reserve one new block in dnode page.
fs/f2fs/super.c +4 -0
@@ -598,6 +598,9 @@ static void f2fs_dirty_inode(struct inode *inode, int flags) inode->i_ino == F2FS_META_INO(sbi))return ; +if (is_inode_flag_set (inode,FI_AUTO_RECOVER )) +clear_inode_flag (inode,FI_AUTO_RECOVER ); +spin_lock (&sbi->inode_lock[DIRTY_META ]);if (is_inode_flag_set (inode,FI_DIRTY_INODE )) {spin_unlock (&sbi->inode_lock[DIRTY_META ]);
@@ -623,6 +626,7 @@ void f2fs_inode_synced(struct inode *inode) }list_del_init (&F2FS_I (inode)->gdirty_list);clear_inode_flag (inode,FI_DIRTY_INODE ); +clear_inode_flag (inode,FI_AUTO_RECOVER );dec_page_count (sbi,F2FS_DIRTY_IMETA );spin_unlock (&sbi->inode_lock[DIRTY_META ]);stat_dec_dirty_inode (F2FS_I_SB (inode),DIRTY_META );
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 9/12 f2fs: add lazytime mount option
In reply to Jaegeuk KimThis patch adds lazytime support.
--- fs/f2fs/super.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
fs/f2fs/super.c +14 -0
@@ -93,6 +93,8 @@ enum { Opt_noinline_data, Opt_data_flush, Opt_fault_injection, + Opt_lazytime, + Opt_nolazytime, Opt_err, };
@@ -119,6 +121,8 @@ static match_table_t f2fs_tokens = { {Opt_noinline_data, "noinline_data"}, {Opt_data_flush, "data_flush"}, {Opt_fault_injection, "fault_injection=%u"}, + {Opt_lazytime, "lazytime"}, + {Opt_nolazytime, "nolazytime"}, {Opt_err, NULL}, };
@@ -506,6 +510,12 @@ static int parse_options(struct super_block *sb, char *options) "FAULT_INJECTION was not selected");#endif break ; +case Opt_lazytime: + sb->s_flags |=MS_LAZYTIME ; +break ; +case Opt_nolazytime: + sb->s_flags &= ~MS_LAZYTIME ; +break ;default : f2fs_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" or missing value",
@@ -598,6 +608,9 @@ static void f2fs_dirty_inode(struct inode *inode, int flags) inode->i_ino == F2FS_META_INO(sbi))return ; +if (flags ==I_DIRTY_TIME ) +return ; +if (is_inode_flag_set (inode,FI_AUTO_RECOVER ))clear_inode_flag (inode,FI_AUTO_RECOVER );
@@ -917,6 +930,7 @@ static void default_options(struct f2fs_sb_info *sbi)set_opt (sbi,BG_GC );set_opt (sbi,INLINE_DATA );set_opt (sbi,EXTENT_CACHE ); + sbi->sb->s_flags |=MS_LAZYTIME ;#ifdef CONFIG_F2FS_FS_XATTR set_opt (sbi,XATTR_USER );
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 10/12 f2fs: detect congestion of flush command issues
In reply to Jaegeuk KimIf flush commands do not incur any congestion, we don't need to throw that to dispatching queue which causes unnecessary latency.
--- fs/f2fs/f2fs.h | 1 + fs/f2fs/segment.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-)
fs/f2fs/f2fs.h +1 -0
@@ -603,6 +603,7 @@ struct flush_cmd {struct flush_cmd_control {struct task_struct *f2fs_issue_flush;/* flush thread */ wait_queue_head_t flush_wait_queue;/* waiting queue for wake-up */ +atomic_t submit_flush;/* # of issued flushes */ struct llist_head issue_list;/* list for command issue */ struct llist_node *dispatch_list;/* list for command dispatch */ };
fs/f2fs/segment.c +6 -1
@@ -433,24 +433,28 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi)if (test_opt (sbi,NOBARRIER ))return 0 ; -if (!test_opt (sbi,FLUSH_MERGE )) { +if (!test_opt (sbi,FLUSH_MERGE ) || !atomic_read (&fcc->submit_flush)) {struct bio *bio =f2fs_bio_alloc (0 );int ret; +atomic_inc (&fcc->submit_flush); bio->bi_bdev = sbi->sb->s_bdev; ret =submit_bio_wait (WRITE_FLUSH , bio); +atomic_dec (&fcc->submit_flush);bio_put (bio);return ret; }init_completion (&cmd.wait); +atomic_inc (&fcc->submit_flush);llist_add (&cmd.llnode, &fcc->issue_list);if (!fcc->dispatch_list)wake_up (&fcc->flush_wait_queue);wait_for_completion (&cmd.wait); +atomic_dec (&fcc->submit_flush);return cmd.ret; }
@@ -464,6 +468,7 @@ int create_flush_cmd_control(struct f2fs_sb_info *sbi) fcc =kzalloc (sizeof (struct flush_cmd_control ),GFP_KERNEL );if (!fcc)return -ENOMEM ; +atomic_set (&fcc->submit_flush,0 );init_waitqueue_head (&fcc->flush_wait_queue);init_llist_head (&fcc->issue_list);SM_I (sbi)->cmd_control_info = fcc;
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 11/12 f2fs: set flush_merge by default
In reply to Jaegeuk KimThis patch sets flush_merge by default.
--- fs/f2fs/super.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/f2fs/super.c +6 -0
@@ -86,6 +86,7 @@ enum { Opt_inline_data, Opt_inline_dentry, Opt_flush_merge, + Opt_noflush_merge, Opt_nobarrier, Opt_fastboot, Opt_extent_cache,
@@ -114,6 +115,7 @@ static match_table_t f2fs_tokens = { {Opt_inline_data, "inline_data"}, {Opt_inline_dentry, "inline_dentry"}, {Opt_flush_merge, "flush_merge"}, + {Opt_noflush_merge, "noflush_merge"}, {Opt_nobarrier, "nobarrier"}, {Opt_fastboot, "fastboot"}, {Opt_extent_cache, "extent_cache"},
@@ -482,6 +484,9 @@ static int parse_options(struct super_block *sb, char *options)case Opt_flush_merge:set_opt (sbi,FLUSH_MERGE );break ; +case Opt_noflush_merge: +clear_opt (sbi,FLUSH_MERGE ); +break ;case Opt_nobarrier:set_opt (sbi,NOBARRIER );break ;
@@ -931,6 +936,7 @@ static void default_options(struct f2fs_sb_info *sbi)set_opt (sbi,INLINE_DATA );set_opt (sbi,EXTENT_CACHE ); sbi->sb->s_flags |=MS_LAZYTIME ; +set_opt (sbi,FLUSH_MERGE );#ifdef CONFIG_F2FS_FS_XATTR set_opt (sbi,XATTR_USER );
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 12/12 f2fs: remove writepages lock
In reply to Jaegeuk KimThis patch removes writepages lock.
We can improve multi-threading performance.
tiobench, 32 threads, 4KB write per fsync on SSD
Before: 25.88 MB/s
After: 28.03 MB/s
--- fs/f2fs/data.c | 7 ------- fs/f2fs/f2fs.h | 1 - fs/f2fs/super.c | 1 - 3 files changed, 9 deletions(-)
fs/f2fs/data.c +0 -7
@@ -1443,7 +1443,6 @@ static int f2fs_write_data_pages(struct address_space *mapping, {struct inode *inode = mapping->host;struct f2fs_sb_info *sbi =F2FS_I_SB (inode); -bool locked = false;int ret;long diff;
@@ -1472,14 +1471,8 @@ static int f2fs_write_data_pages(struct address_space *mapping, diff =nr_pages_to_write (sbi,DATA , wbc); -if (!S_ISDIR (inode->i_mode) && wbc->sync_mode ==WB_SYNC_ALL ) { -mutex_lock (&sbi->writepages); - locked = true; - } ret =f2fs_write_cache_pages (mapping, wbc, __f2fs_writepage, mapping);f2fs_submit_merged_bio_cond (sbi, inode,NULL ,0 ,DATA ,WRITE ); -if (locked) -mutex_unlock (&sbi->writepages);remove_dirty_inode (inode);
fs/f2fs/f2fs.h +0 -1
@@ -770,7 +770,6 @@ struct f2fs_sb_info {struct mutex cp_mutex;/* checkpoint procedure lock */ struct rw_semaphore cp_rwsem;/* blocking FS operations */ struct rw_semaphore node_write;/* locking node writes */ -struct mutex writepages;/* mutex for writepages() */ wait_queue_head_t cp_wait;unsigned long last_time[MAX_TIME ];/* to store time in jiffies */ long interval_time[MAX_TIME ];/* to store thresholds */
fs/f2fs/super.c +0 -1
@@ -1615,7 +1615,6 @@ try_onemore: sbi->raw_super = raw_super; sbi->valid_super_block = valid_super_block;mutex_init (&sbi->gc_mutex); -mutex_init (&sbi->writepages);mutex_init (&sbi->cp_mutex);init_rwsem (&sbi->node_write);
Signature · 1 line
2.6.3