diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-05-20 19:32:49 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-06-02 21:05:12 -0400 |
commit | ee6d182f2a19d5d44607b5ae4bec523726d76a99 (patch) | |
tree | 514092851eb0e974c6ac8add90fed10056b84998 /fs | |
parent | 0f18b462b2e5aff64b8638e8a47284b907351ef3 (diff) |
f2fs: remove syncing inode page in all the cases
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/f2fs/data.c | 11 | ||||
-rw-r--r-- | fs/f2fs/dir.c | 24 | ||||
-rw-r--r-- | fs/f2fs/extent_cache.c | 7 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 2 | ||||
-rw-r--r-- | fs/f2fs/file.c | 15 | ||||
-rw-r--r-- | fs/f2fs/inline.c | 27 | ||||
-rw-r--r-- | fs/f2fs/namei.c | 15 | ||||
-rw-r--r-- | fs/f2fs/node.c | 28 | ||||
-rw-r--r-- | fs/f2fs/recovery.c | 3 | ||||
-rw-r--r-- | fs/f2fs/xattr.c | 6 |
10 files changed, 17 insertions, 121 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 6a4c60c2fd3a..a3dea51f4702 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -343,8 +343,6 @@ int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count) | |||
343 | 343 | ||
344 | if (set_page_dirty(dn->node_page)) | 344 | if (set_page_dirty(dn->node_page)) |
345 | dn->node_changed = true; | 345 | dn->node_changed = true; |
346 | |||
347 | sync_inode_page(dn); | ||
348 | return 0; | 346 | return 0; |
349 | } | 347 | } |
350 | 348 | ||
@@ -562,11 +560,8 @@ struct page *get_new_data_page(struct inode *inode, | |||
562 | } | 560 | } |
563 | got_it: | 561 | got_it: |
564 | if (new_i_size && i_size_read(inode) < | 562 | if (new_i_size && i_size_read(inode) < |
565 | ((loff_t)(index + 1) << PAGE_SHIFT)) { | 563 | ((loff_t)(index + 1) << PAGE_SHIFT)) |
566 | f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT)); | 564 | f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT)); |
567 | /* Only the directory inode sets new_i_size */ | ||
568 | set_inode_flag(inode, FI_UPDATE_DIR); | ||
569 | } | ||
570 | return page; | 565 | return page; |
571 | } | 566 | } |
572 | 567 | ||
@@ -787,8 +782,6 @@ skip: | |||
787 | else if (dn.ofs_in_node < end_offset) | 782 | else if (dn.ofs_in_node < end_offset) |
788 | goto next_block; | 783 | goto next_block; |
789 | 784 | ||
790 | if (allocated) | ||
791 | sync_inode_page(&dn); | ||
792 | f2fs_put_dnode(&dn); | 785 | f2fs_put_dnode(&dn); |
793 | 786 | ||
794 | if (create) { | 787 | if (create) { |
@@ -799,8 +792,6 @@ skip: | |||
799 | goto next_dnode; | 792 | goto next_dnode; |
800 | 793 | ||
801 | sync_out: | 794 | sync_out: |
802 | if (allocated) | ||
803 | sync_inode_page(&dn); | ||
804 | f2fs_put_dnode(&dn); | 795 | f2fs_put_dnode(&dn); |
805 | unlock_out: | 796 | unlock_out: |
806 | if (create) { | 797 | if (create) { |
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index 384d51cb77bf..24d1308838b5 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c | |||
@@ -454,19 +454,15 @@ void update_parent_metadata(struct inode *dir, struct inode *inode, | |||
454 | unsigned int current_depth) | 454 | unsigned int current_depth) |
455 | { | 455 | { |
456 | if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) { | 456 | if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) { |
457 | if (S_ISDIR(inode->i_mode)) { | 457 | if (S_ISDIR(inode->i_mode)) |
458 | f2fs_i_links_write(dir, true); | 458 | f2fs_i_links_write(dir, true); |
459 | set_inode_flag(dir, FI_UPDATE_DIR); | ||
460 | } | ||
461 | clear_inode_flag(inode, FI_NEW_INODE); | 459 | clear_inode_flag(inode, FI_NEW_INODE); |
462 | } | 460 | } |
463 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 461 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
464 | mark_inode_dirty_sync(dir); | 462 | mark_inode_dirty_sync(dir); |
465 | 463 | ||
466 | if (F2FS_I(dir)->i_current_depth != current_depth) { | 464 | if (F2FS_I(dir)->i_current_depth != current_depth) |
467 | f2fs_i_depth_write(dir, current_depth); | 465 | f2fs_i_depth_write(dir, current_depth); |
468 | set_inode_flag(dir, FI_UPDATE_DIR); | ||
469 | } | ||
470 | 466 | ||
471 | if (inode && is_inode_flag_set(inode, FI_INC_LINK)) | 467 | if (inode && is_inode_flag_set(inode, FI_INC_LINK)) |
472 | clear_inode_flag(inode, FI_INC_LINK); | 468 | clear_inode_flag(inode, FI_INC_LINK); |
@@ -595,9 +591,7 @@ add_dentry: | |||
595 | set_page_dirty(dentry_page); | 591 | set_page_dirty(dentry_page); |
596 | 592 | ||
597 | if (inode) { | 593 | if (inode) { |
598 | /* we don't need to mark_inode_dirty now */ | ||
599 | f2fs_i_pino_write(inode, dir->i_ino); | 594 | f2fs_i_pino_write(inode, dir->i_ino); |
600 | update_inode(inode, page); | ||
601 | f2fs_put_page(page, 1); | 595 | f2fs_put_page(page, 1); |
602 | } | 596 | } |
603 | 597 | ||
@@ -606,10 +600,6 @@ fail: | |||
606 | if (inode) | 600 | if (inode) |
607 | up_write(&F2FS_I(inode)->i_sem); | 601 | up_write(&F2FS_I(inode)->i_sem); |
608 | 602 | ||
609 | if (is_inode_flag_set(dir, FI_UPDATE_DIR)) { | ||
610 | update_inode_page(dir); | ||
611 | clear_inode_flag(dir, FI_UPDATE_DIR); | ||
612 | } | ||
613 | kunmap(dentry_page); | 603 | kunmap(dentry_page); |
614 | f2fs_put_page(dentry_page, 1); | 604 | f2fs_put_page(dentry_page, 1); |
615 | 605 | ||
@@ -656,8 +646,6 @@ int f2fs_do_tmpfile(struct inode *inode, struct inode *dir) | |||
656 | err = PTR_ERR(page); | 646 | err = PTR_ERR(page); |
657 | goto fail; | 647 | goto fail; |
658 | } | 648 | } |
659 | /* we don't need to mark_inode_dirty now */ | ||
660 | update_inode(inode, page); | ||
661 | f2fs_put_page(page, 1); | 649 | f2fs_put_page(page, 1); |
662 | 650 | ||
663 | clear_inode_flag(inode, FI_NEW_INODE); | 651 | clear_inode_flag(inode, FI_NEW_INODE); |
@@ -673,13 +661,8 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page) | |||
673 | 661 | ||
674 | down_write(&F2FS_I(inode)->i_sem); | 662 | down_write(&F2FS_I(inode)->i_sem); |
675 | 663 | ||
676 | if (S_ISDIR(inode->i_mode)) { | 664 | if (S_ISDIR(inode->i_mode)) |
677 | f2fs_i_links_write(dir, false); | 665 | f2fs_i_links_write(dir, false); |
678 | if (page) | ||
679 | update_inode(dir, page); | ||
680 | else | ||
681 | update_inode_page(dir); | ||
682 | } | ||
683 | inode->i_ctime = CURRENT_TIME; | 666 | inode->i_ctime = CURRENT_TIME; |
684 | 667 | ||
685 | f2fs_i_links_write(inode, false); | 668 | f2fs_i_links_write(inode, false); |
@@ -688,7 +671,6 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page) | |||
688 | f2fs_i_size_write(inode, 0); | 671 | f2fs_i_size_write(inode, 0); |
689 | } | 672 | } |
690 | up_write(&F2FS_I(inode)->i_sem); | 673 | up_write(&F2FS_I(inode)->i_sem); |
691 | update_inode_page(inode); | ||
692 | 674 | ||
693 | if (inode->i_nlink == 0) | 675 | if (inode->i_nlink == 0) |
694 | add_orphan_inode(sbi, inode->i_ino); | 676 | add_orphan_inode(sbi, inode->i_ino); |
diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c index d21dda607bf2..e858869d76cb 100644 --- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c | |||
@@ -689,9 +689,7 @@ void f2fs_update_extent_cache(struct dnode_of_data *dn) | |||
689 | 689 | ||
690 | fofs = start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) + | 690 | fofs = start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) + |
691 | dn->ofs_in_node; | 691 | dn->ofs_in_node; |
692 | 692 | f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, 1); | |
693 | if (f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, 1)) | ||
694 | sync_inode_page(dn); | ||
695 | } | 693 | } |
696 | 694 | ||
697 | void f2fs_update_extent_cache_range(struct dnode_of_data *dn, | 695 | 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, | |||
701 | if (!f2fs_may_extent_tree(dn->inode)) | 699 | if (!f2fs_may_extent_tree(dn->inode)) |
702 | return; | 700 | return; |
703 | 701 | ||
704 | if (f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, len)) | 702 | f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, len); |
705 | sync_inode_page(dn); | ||
706 | } | 703 | } |
707 | 704 | ||
708 | void init_extent_cache_info(struct f2fs_sb_info *sbi) | 705 | void init_extent_cache_info(struct f2fs_sb_info *sbi) |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index b541164ce5af..2adef0e58461 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -1521,7 +1521,6 @@ enum { | |||
1521 | FI_ACL_MODE, /* indicate acl mode */ | 1521 | FI_ACL_MODE, /* indicate acl mode */ |
1522 | FI_NO_ALLOC, /* should not allocate any blocks */ | 1522 | FI_NO_ALLOC, /* should not allocate any blocks */ |
1523 | FI_FREE_NID, /* free allocated nide */ | 1523 | FI_FREE_NID, /* free allocated nide */ |
1524 | FI_UPDATE_DIR, /* should update inode block for consistency */ | ||
1525 | FI_NO_EXTENT, /* not to use the extent cache */ | 1524 | FI_NO_EXTENT, /* not to use the extent cache */ |
1526 | FI_INLINE_XATTR, /* used for inline xattr */ | 1525 | FI_INLINE_XATTR, /* used for inline xattr */ |
1527 | FI_INLINE_DATA, /* used for inline data*/ | 1526 | FI_INLINE_DATA, /* used for inline data*/ |
@@ -1936,7 +1935,6 @@ struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *); | |||
1936 | void ra_node_page(struct f2fs_sb_info *, nid_t); | 1935 | void ra_node_page(struct f2fs_sb_info *, nid_t); |
1937 | struct page *get_node_page(struct f2fs_sb_info *, pgoff_t); | 1936 | struct page *get_node_page(struct f2fs_sb_info *, pgoff_t); |
1938 | struct page *get_node_page_ra(struct page *, int); | 1937 | struct page *get_node_page_ra(struct page *, int); |
1939 | void sync_inode_page(struct dnode_of_data *); | ||
1940 | void move_node_page(struct page *, int); | 1938 | void move_node_page(struct page *, int); |
1941 | int fsync_node_pages(struct f2fs_sb_info *, nid_t, struct writeback_control *, | 1939 | int fsync_node_pages(struct f2fs_sb_info *, nid_t, struct writeback_control *, |
1942 | bool); | 1940 | bool); |
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index c5606b1e1a89..73bc946974ad 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -173,12 +173,8 @@ static void try_to_fix_pino(struct inode *inode) | |||
173 | get_parent_ino(inode, &pino)) { | 173 | get_parent_ino(inode, &pino)) { |
174 | f2fs_i_pino_write(inode, pino); | 174 | f2fs_i_pino_write(inode, pino); |
175 | file_got_pino(inode); | 175 | file_got_pino(inode); |
176 | up_write(&fi->i_sem); | ||
177 | |||
178 | f2fs_write_inode(inode, NULL); | ||
179 | } else { | ||
180 | up_write(&fi->i_sem); | ||
181 | } | 176 | } |
177 | up_write(&fi->i_sem); | ||
182 | } | 178 | } |
183 | 179 | ||
184 | static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end, | 180 | 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) | |||
499 | dn->inode) + ofs; | 495 | dn->inode) + ofs; |
500 | f2fs_update_extent_cache_range(dn, fofs, 0, len); | 496 | f2fs_update_extent_cache_range(dn, fofs, 0, len); |
501 | dec_valid_block_count(sbi, dn->inode, nr_free); | 497 | dec_valid_block_count(sbi, dn->inode, nr_free); |
502 | sync_inode_page(dn); | ||
503 | } | 498 | } |
504 | dn->ofs_in_node = ofs; | 499 | dn->ofs_in_node = ofs; |
505 | 500 | ||
@@ -1123,10 +1118,8 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, | |||
1123 | } | 1118 | } |
1124 | 1119 | ||
1125 | out: | 1120 | out: |
1126 | if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) { | 1121 | if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) |
1127 | f2fs_i_size_write(inode, new_size); | 1122 | f2fs_i_size_write(inode, new_size); |
1128 | update_inode_page(inode); | ||
1129 | } | ||
1130 | 1123 | ||
1131 | return ret; | 1124 | return ret; |
1132 | } | 1125 | } |
@@ -1232,10 +1225,8 @@ static int expand_inode_data(struct inode *inode, loff_t offset, | |||
1232 | new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end; | 1225 | new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end; |
1233 | } | 1226 | } |
1234 | 1227 | ||
1235 | if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) { | 1228 | if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) |
1236 | f2fs_i_size_write(inode, new_size); | 1229 | f2fs_i_size_write(inode, new_size); |
1237 | update_inode_page(inode); | ||
1238 | } | ||
1239 | 1230 | ||
1240 | return ret; | 1231 | return ret; |
1241 | } | 1232 | } |
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 4bc025c29f82..77c9c2439993 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
@@ -73,7 +73,7 @@ bool truncate_inline_inode(struct page *ipage, u64 from) | |||
73 | 73 | ||
74 | f2fs_wait_on_page_writeback(ipage, NODE, true); | 74 | f2fs_wait_on_page_writeback(ipage, NODE, true); |
75 | memset(addr + from, 0, MAX_INLINE_DATA - from); | 75 | memset(addr + from, 0, MAX_INLINE_DATA - from); |
76 | 76 | set_page_dirty(ipage); | |
77 | return true; | 77 | return true; |
78 | } | 78 | } |
79 | 79 | ||
@@ -146,7 +146,6 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) | |||
146 | clear_out: | 146 | clear_out: |
147 | stat_dec_inline_inode(dn->inode); | 147 | stat_dec_inline_inode(dn->inode); |
148 | f2fs_clear_inline_inode(dn->inode); | 148 | f2fs_clear_inline_inode(dn->inode); |
149 | sync_inode_page(dn); | ||
150 | f2fs_put_dnode(dn); | 149 | f2fs_put_dnode(dn); |
151 | return 0; | 150 | return 0; |
152 | } | 151 | } |
@@ -212,11 +211,11 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page) | |||
212 | dst_addr = inline_data_addr(dn.inode_page); | 211 | dst_addr = inline_data_addr(dn.inode_page); |
213 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); | 212 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); |
214 | kunmap_atomic(src_addr); | 213 | kunmap_atomic(src_addr); |
214 | set_page_dirty(dn.inode_page); | ||
215 | 215 | ||
216 | set_inode_flag(inode, FI_APPEND_WRITE); | 216 | set_inode_flag(inode, FI_APPEND_WRITE); |
217 | set_inode_flag(inode, FI_DATA_EXIST); | 217 | set_inode_flag(inode, FI_DATA_EXIST); |
218 | 218 | ||
219 | sync_inode_page(&dn); | ||
220 | clear_inline_node(dn.inode_page); | 219 | clear_inline_node(dn.inode_page); |
221 | f2fs_put_dnode(&dn); | 220 | f2fs_put_dnode(&dn); |
222 | return 0; | 221 | return 0; |
@@ -255,7 +254,7 @@ process_inline: | |||
255 | set_inode_flag(inode, FI_INLINE_DATA); | 254 | set_inode_flag(inode, FI_INLINE_DATA); |
256 | set_inode_flag(inode, FI_DATA_EXIST); | 255 | set_inode_flag(inode, FI_DATA_EXIST); |
257 | 256 | ||
258 | update_inode(inode, ipage); | 257 | set_page_dirty(ipage); |
259 | f2fs_put_page(ipage, 1); | 258 | f2fs_put_page(ipage, 1); |
260 | return true; | 259 | return true; |
261 | } | 260 | } |
@@ -266,7 +265,6 @@ process_inline: | |||
266 | if (!truncate_inline_inode(ipage, 0)) | 265 | if (!truncate_inline_inode(ipage, 0)) |
267 | return false; | 266 | return false; |
268 | f2fs_clear_inline_inode(inode); | 267 | f2fs_clear_inline_inode(inode); |
269 | update_inode(inode, ipage); | ||
270 | f2fs_put_page(ipage, 1); | 268 | f2fs_put_page(ipage, 1); |
271 | } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) { | 269 | } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) { |
272 | if (truncate_blocks(inode, 0, false)) | 270 | if (truncate_blocks(inode, 0, false)) |
@@ -339,10 +337,8 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent, | |||
339 | set_page_dirty(ipage); | 337 | set_page_dirty(ipage); |
340 | 338 | ||
341 | /* update i_size to MAX_INLINE_DATA */ | 339 | /* update i_size to MAX_INLINE_DATA */ |
342 | if (i_size_read(inode) < MAX_INLINE_DATA) { | 340 | if (i_size_read(inode) < MAX_INLINE_DATA) |
343 | f2fs_i_size_write(inode, MAX_INLINE_DATA); | 341 | f2fs_i_size_write(inode, MAX_INLINE_DATA); |
344 | set_inode_flag(inode, FI_UPDATE_DIR); | ||
345 | } | ||
346 | return 0; | 342 | return 0; |
347 | } | 343 | } |
348 | 344 | ||
@@ -401,12 +397,8 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage, | |||
401 | clear_inode_flag(dir, FI_INLINE_DENTRY); | 397 | clear_inode_flag(dir, FI_INLINE_DENTRY); |
402 | 398 | ||
403 | f2fs_i_depth_write(dir, 1); | 399 | f2fs_i_depth_write(dir, 1); |
404 | if (i_size_read(dir) < PAGE_SIZE) { | 400 | if (i_size_read(dir) < PAGE_SIZE) |
405 | f2fs_i_size_write(dir, PAGE_SIZE); | 401 | f2fs_i_size_write(dir, PAGE_SIZE); |
406 | set_inode_flag(dir, FI_UPDATE_DIR); | ||
407 | } | ||
408 | |||
409 | sync_inode_page(&dn); | ||
410 | out: | 402 | out: |
411 | f2fs_put_page(page, 1); | 403 | f2fs_put_page(page, 1); |
412 | return err; | 404 | return err; |
@@ -486,7 +478,6 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage, | |||
486 | 478 | ||
487 | stat_dec_inline_dir(dir); | 479 | stat_dec_inline_dir(dir); |
488 | clear_inode_flag(dir, FI_INLINE_DENTRY); | 480 | clear_inode_flag(dir, FI_INLINE_DENTRY); |
489 | update_inode(dir, ipage); | ||
490 | kfree(backup_dentry); | 481 | kfree(backup_dentry); |
491 | return 0; | 482 | return 0; |
492 | recover: | 483 | recover: |
@@ -494,7 +485,7 @@ recover: | |||
494 | memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA); | 485 | memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA); |
495 | f2fs_i_depth_write(dir, 0); | 486 | f2fs_i_depth_write(dir, 0); |
496 | f2fs_i_size_write(dir, MAX_INLINE_DATA); | 487 | f2fs_i_size_write(dir, MAX_INLINE_DATA); |
497 | update_inode(dir, ipage); | 488 | set_page_dirty(ipage); |
498 | f2fs_put_page(ipage, 1); | 489 | f2fs_put_page(ipage, 1); |
499 | 490 | ||
500 | kfree(backup_dentry); | 491 | kfree(backup_dentry); |
@@ -559,7 +550,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name, | |||
559 | /* we don't need to mark_inode_dirty now */ | 550 | /* we don't need to mark_inode_dirty now */ |
560 | if (inode) { | 551 | if (inode) { |
561 | f2fs_i_pino_write(inode, dir->i_ino); | 552 | f2fs_i_pino_write(inode, dir->i_ino); |
562 | update_inode(inode, page); | ||
563 | f2fs_put_page(page, 1); | 553 | f2fs_put_page(page, 1); |
564 | } | 554 | } |
565 | 555 | ||
@@ -567,11 +557,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name, | |||
567 | fail: | 557 | fail: |
568 | if (inode) | 558 | if (inode) |
569 | up_write(&F2FS_I(inode)->i_sem); | 559 | up_write(&F2FS_I(inode)->i_sem); |
570 | |||
571 | if (is_inode_flag_set(dir, FI_UPDATE_DIR)) { | ||
572 | update_inode(dir, ipage); | ||
573 | clear_inode_flag(dir, FI_UPDATE_DIR); | ||
574 | } | ||
575 | out: | 560 | out: |
576 | f2fs_put_page(ipage, 1); | 561 | f2fs_put_page(ipage, 1); |
577 | return err; | 562 | return err; |
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index f2b2c4068648..496f4e3018b2 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c | |||
@@ -706,9 +706,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
706 | add_orphan_inode(sbi, new_inode->i_ino); | 706 | add_orphan_inode(sbi, new_inode->i_ino); |
707 | else | 707 | else |
708 | release_orphan_inode(sbi); | 708 | release_orphan_inode(sbi); |
709 | |||
710 | update_inode_page(old_inode); | ||
711 | update_inode_page(new_inode); | ||
712 | } else { | 709 | } else { |
713 | f2fs_balance_fs(sbi, true); | 710 | f2fs_balance_fs(sbi, true); |
714 | 711 | ||
@@ -720,10 +717,8 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
720 | goto out_whiteout; | 717 | goto out_whiteout; |
721 | } | 718 | } |
722 | 719 | ||
723 | if (old_dir_entry) { | 720 | if (old_dir_entry) |
724 | f2fs_i_links_write(new_dir, true); | 721 | f2fs_i_links_write(new_dir, true); |
725 | update_inode_page(new_dir); | ||
726 | } | ||
727 | 722 | ||
728 | /* | 723 | /* |
729 | * old entry and new entry can locate in the same inline | 724 | * 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, | |||
771 | if (old_dir != new_dir && !whiteout) { | 766 | if (old_dir != new_dir && !whiteout) { |
772 | f2fs_set_link(old_inode, old_dir_entry, | 767 | f2fs_set_link(old_inode, old_dir_entry, |
773 | old_dir_page, new_dir); | 768 | old_dir_page, new_dir); |
774 | update_inode_page(old_inode); | ||
775 | } else { | 769 | } else { |
776 | f2fs_dentry_kunmap(old_inode, old_dir_page); | 770 | f2fs_dentry_kunmap(old_inode, old_dir_page); |
777 | f2fs_put_page(old_dir_page, 0); | 771 | f2fs_put_page(old_dir_page, 0); |
778 | } | 772 | } |
779 | f2fs_i_links_write(old_dir, false); | 773 | f2fs_i_links_write(old_dir, false); |
780 | update_inode_page(old_dir); | ||
781 | } | 774 | } |
782 | 775 | ||
783 | f2fs_unlock_op(sbi); | 776 | f2fs_unlock_op(sbi); |
@@ -899,8 +892,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
899 | file_lost_pino(old_inode); | 892 | file_lost_pino(old_inode); |
900 | up_write(&F2FS_I(old_inode)->i_sem); | 893 | up_write(&F2FS_I(old_inode)->i_sem); |
901 | 894 | ||
902 | update_inode_page(old_inode); | ||
903 | |||
904 | old_dir->i_ctime = CURRENT_TIME; | 895 | old_dir->i_ctime = CURRENT_TIME; |
905 | if (old_nlink) { | 896 | if (old_nlink) { |
906 | down_write(&F2FS_I(old_dir)->i_sem); | 897 | 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, | |||
908 | up_write(&F2FS_I(old_dir)->i_sem); | 899 | up_write(&F2FS_I(old_dir)->i_sem); |
909 | } | 900 | } |
910 | mark_inode_dirty_sync(old_dir); | 901 | mark_inode_dirty_sync(old_dir); |
911 | update_inode_page(old_dir); | ||
912 | 902 | ||
913 | /* update directory entry info of new dir inode */ | 903 | /* update directory entry info of new dir inode */ |
914 | f2fs_set_link(new_dir, new_entry, new_page, old_inode); | 904 | 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, | |||
917 | file_lost_pino(new_inode); | 907 | file_lost_pino(new_inode); |
918 | up_write(&F2FS_I(new_inode)->i_sem); | 908 | up_write(&F2FS_I(new_inode)->i_sem); |
919 | 909 | ||
920 | update_inode_page(new_inode); | ||
921 | |||
922 | new_dir->i_ctime = CURRENT_TIME; | 910 | new_dir->i_ctime = CURRENT_TIME; |
923 | if (new_nlink) { | 911 | if (new_nlink) { |
924 | down_write(&F2FS_I(new_dir)->i_sem); | 912 | 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, | |||
926 | up_write(&F2FS_I(new_dir)->i_sem); | 914 | up_write(&F2FS_I(new_dir)->i_sem); |
927 | } | 915 | } |
928 | mark_inode_dirty_sync(new_dir); | 916 | mark_inode_dirty_sync(new_dir); |
929 | update_inode_page(new_dir); | ||
930 | 917 | ||
931 | f2fs_unlock_op(sbi); | 918 | f2fs_unlock_op(sbi); |
932 | 919 | ||
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 1965351b644c..82f0f833151e 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -671,8 +671,6 @@ static void truncate_node(struct dnode_of_data *dn) | |||
671 | remove_orphan_inode(sbi, dn->nid); | 671 | remove_orphan_inode(sbi, dn->nid); |
672 | dec_valid_inode_count(sbi); | 672 | dec_valid_inode_count(sbi); |
673 | f2fs_inode_synced(dn->inode); | 673 | f2fs_inode_synced(dn->inode); |
674 | } else { | ||
675 | sync_inode_page(dn); | ||
676 | } | 674 | } |
677 | invalidate: | 675 | invalidate: |
678 | clear_node_page_dirty(dn->node_page); | 676 | clear_node_page_dirty(dn->node_page); |
@@ -1050,14 +1048,8 @@ struct page *new_node_page(struct dnode_of_data *dn, | |||
1050 | if (f2fs_has_xattr_block(ofs)) | 1048 | if (f2fs_has_xattr_block(ofs)) |
1051 | f2fs_i_xnid_write(dn->inode, dn->nid); | 1049 | f2fs_i_xnid_write(dn->inode, dn->nid); |
1052 | 1050 | ||
1053 | dn->node_page = page; | ||
1054 | if (ipage) | ||
1055 | update_inode(dn->inode, ipage); | ||
1056 | else | ||
1057 | sync_inode_page(dn); | ||
1058 | if (ofs == 0) | 1051 | if (ofs == 0) |
1059 | inc_valid_inode_count(sbi); | 1052 | inc_valid_inode_count(sbi); |
1060 | |||
1061 | return page; | 1053 | return page; |
1062 | 1054 | ||
1063 | fail: | 1055 | fail: |
@@ -1176,24 +1168,6 @@ struct page *get_node_page_ra(struct page *parent, int start) | |||
1176 | return __get_node_page(sbi, nid, parent, start); | 1168 | return __get_node_page(sbi, nid, parent, start); |
1177 | } | 1169 | } |
1178 | 1170 | ||
1179 | void sync_inode_page(struct dnode_of_data *dn) | ||
1180 | { | ||
1181 | int ret = 0; | ||
1182 | |||
1183 | if (IS_INODE(dn->node_page) || dn->inode_page == dn->node_page) { | ||
1184 | ret = update_inode(dn->inode, dn->node_page); | ||
1185 | } else if (dn->inode_page) { | ||
1186 | if (!dn->inode_page_locked) | ||
1187 | lock_page(dn->inode_page); | ||
1188 | ret = update_inode(dn->inode, dn->inode_page); | ||
1189 | if (!dn->inode_page_locked) | ||
1190 | unlock_page(dn->inode_page); | ||
1191 | } else { | ||
1192 | ret = update_inode_page(dn->inode); | ||
1193 | } | ||
1194 | dn->node_changed = ret ? true: false; | ||
1195 | } | ||
1196 | |||
1197 | static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino) | 1171 | static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino) |
1198 | { | 1172 | { |
1199 | struct inode *inode; | 1173 | struct inode *inode; |
@@ -2003,8 +1977,6 @@ recover_xnid: | |||
2003 | /* 3: update xattr blkaddr */ | 1977 | /* 3: update xattr blkaddr */ |
2004 | refresh_sit_entry(sbi, NEW_ADDR, blkaddr); | 1978 | refresh_sit_entry(sbi, NEW_ADDR, blkaddr); |
2005 | set_node_addr(sbi, &ni, blkaddr, false); | 1979 | set_node_addr(sbi, &ni, blkaddr, false); |
2006 | |||
2007 | update_inode_page(inode); | ||
2008 | } | 1980 | } |
2009 | 1981 | ||
2010 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) | 1982 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) |
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 2500b6a5daf0..68c433f17ab5 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c | |||
@@ -490,9 +490,6 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, | |||
490 | } | 490 | } |
491 | } | 491 | } |
492 | 492 | ||
493 | if (IS_INODE(dn.node_page)) | ||
494 | sync_inode_page(&dn); | ||
495 | |||
496 | copy_node_footer(dn.node_page, page); | 493 | copy_node_footer(dn.node_page, page); |
497 | fill_node_footer(dn.node_page, dn.nid, ni.ino, | 494 | fill_node_footer(dn.node_page, dn.nid, ni.ino, |
498 | ofs_of_node(page), false); | 495 | ofs_of_node(page), false); |
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index 1fe6366a60c1..8c0a3b36a917 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c | |||
@@ -299,6 +299,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, | |||
299 | if (ipage) { | 299 | if (ipage) { |
300 | inline_addr = inline_xattr_addr(ipage); | 300 | inline_addr = inline_xattr_addr(ipage); |
301 | f2fs_wait_on_page_writeback(ipage, NODE, true); | 301 | f2fs_wait_on_page_writeback(ipage, NODE, true); |
302 | set_page_dirty(ipage); | ||
302 | } else { | 303 | } else { |
303 | page = get_node_page(sbi, inode->i_ino); | 304 | page = get_node_page(sbi, inode->i_ino); |
304 | if (IS_ERR(page)) { | 305 | if (IS_ERR(page)) { |
@@ -546,11 +547,6 @@ static int __f2fs_setxattr(struct inode *inode, int index, | |||
546 | if (index == F2FS_XATTR_INDEX_ENCRYPTION && | 547 | if (index == F2FS_XATTR_INDEX_ENCRYPTION && |
547 | !strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT)) | 548 | !strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT)) |
548 | f2fs_set_encrypted_inode(inode); | 549 | f2fs_set_encrypted_inode(inode); |
549 | |||
550 | if (ipage) | ||
551 | update_inode(inode, ipage); | ||
552 | else | ||
553 | update_inode_page(inode); | ||
554 | mark_inode_dirty_sync(inode); | 550 | mark_inode_dirty_sync(inode); |
555 | exit: | 551 | exit: |
556 | kzfree(base_addr); | 552 | kzfree(base_addr); |