aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2016-05-20 12:43:20 -0400
committerJaegeuk Kim <jaegeuk@kernel.org>2016-06-02 21:05:10 -0400
commita1961246c392dbf7dabdc81b4e074c32053fbf61 (patch)
tree452d915dba0d3dffdaeeb207c59edea09228d922 /fs/f2fs
parent8edd03c870e4eb8d635d507a7d83fe35d76117c2 (diff)
f2fs: introduce f2fs_i_links_write with mark_inode_dirty_sync
This patch introduces f2fs_i_links_write() to call mark_inode_dirty_sync() when changing inode->i_links. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/checkpoint.c1
-rw-r--r--fs/f2fs/dir.c10
-rw-r--r--fs/f2fs/f2fs.h9
-rw-r--r--fs/f2fs/namei.c30
4 files changed, 24 insertions, 26 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index aa8cb4559ff8..02e0522beccf 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -535,6 +535,7 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
535 } 535 }
536 536
537 clear_nlink(inode); 537 clear_nlink(inode);
538 mark_inode_dirty_sync(inode);
538 539
539 /* truncate all the data during iput */ 540 /* truncate all the data during iput */
540 iput(inode); 541 iput(inode);
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index dc4beae14c92..f8ca0f31271f 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -437,7 +437,7 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,
437 */ 437 */
438 if (inode->i_nlink == 0) 438 if (inode->i_nlink == 0)
439 remove_orphan_inode(F2FS_I_SB(dir), inode->i_ino); 439 remove_orphan_inode(F2FS_I_SB(dir), inode->i_ino);
440 inc_nlink(inode); 440 f2fs_i_links_write(inode, true);
441 } 441 }
442 return page; 442 return page;
443 443
@@ -456,7 +456,7 @@ void update_parent_metadata(struct inode *dir, struct inode *inode,
456{ 456{
457 if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) { 457 if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) {
458 if (S_ISDIR(inode->i_mode)) { 458 if (S_ISDIR(inode->i_mode)) {
459 inc_nlink(dir); 459 f2fs_i_links_write(dir, true);
460 set_inode_flag(dir, FI_UPDATE_DIR); 460 set_inode_flag(dir, FI_UPDATE_DIR);
461 } 461 }
462 clear_inode_flag(inode, FI_NEW_INODE); 462 clear_inode_flag(inode, FI_NEW_INODE);
@@ -675,7 +675,7 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
675 down_write(&F2FS_I(inode)->i_sem); 675 down_write(&F2FS_I(inode)->i_sem);
676 676
677 if (S_ISDIR(inode->i_mode)) { 677 if (S_ISDIR(inode->i_mode)) {
678 drop_nlink(dir); 678 f2fs_i_links_write(dir, false);
679 if (page) 679 if (page)
680 update_inode(dir, page); 680 update_inode(dir, page);
681 else 681 else
@@ -683,9 +683,9 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
683 } 683 }
684 inode->i_ctime = CURRENT_TIME; 684 inode->i_ctime = CURRENT_TIME;
685 685
686 drop_nlink(inode); 686 f2fs_i_links_write(inode, false);
687 if (S_ISDIR(inode->i_mode)) { 687 if (S_ISDIR(inode->i_mode)) {
688 drop_nlink(inode); 688 f2fs_i_links_write(inode, false);
689 f2fs_i_size_write(inode, 0); 689 f2fs_i_size_write(inode, 0);
690 } 690 }
691 up_write(&F2FS_I(inode)->i_sem); 691 up_write(&F2FS_I(inode)->i_sem);
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 9536e9e17b40..d98aaf3829a6 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1557,6 +1557,15 @@ static inline void set_acl_inode(struct inode *inode, umode_t mode)
1557 set_inode_flag(inode, FI_ACL_MODE); 1557 set_inode_flag(inode, FI_ACL_MODE);
1558} 1558}
1559 1559
1560static inline void f2fs_i_links_write(struct inode *inode, bool inc)
1561{
1562 if (inc)
1563 inc_nlink(inode);
1564 else
1565 drop_nlink(inode);
1566 mark_inode_dirty_sync(inode);
1567}
1568
1560static inline void f2fs_i_blocks_write(struct inode *inode, 1569static inline void f2fs_i_blocks_write(struct inode *inode,
1561 blkcnt_t diff, bool add) 1570 blkcnt_t diff, bool add)
1562{ 1571{
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index cbf61a5f0e57..af7c75ab9343 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -349,9 +349,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
349 f2fs_delete_entry(de, page, dir, inode); 349 f2fs_delete_entry(de, page, dir, inode);
350 f2fs_unlock_op(sbi); 350 f2fs_unlock_op(sbi);
351 351
352 /* In order to evict this inode, we set it dirty */
353 mark_inode_dirty(inode);
354
355 if (IS_DIRSYNC(dir)) 352 if (IS_DIRSYNC(dir))
356 f2fs_sync_fs(sbi->sb, 1); 353 f2fs_sync_fs(sbi->sb, 1);
357fail: 354fail:
@@ -597,16 +594,16 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
597 * remove all unused data of tmpfile after abnormal power-off. 594 * remove all unused data of tmpfile after abnormal power-off.
598 */ 595 */
599 add_orphan_inode(sbi, inode->i_ino); 596 add_orphan_inode(sbi, inode->i_ino);
600 f2fs_unlock_op(sbi);
601
602 alloc_nid_done(sbi, inode->i_ino); 597 alloc_nid_done(sbi, inode->i_ino);
603 598
604 if (whiteout) { 599 if (whiteout) {
605 inode_dec_link_count(inode); 600 f2fs_i_links_write(inode, false);
606 *whiteout = inode; 601 *whiteout = inode;
607 } else { 602 } else {
608 d_tmpfile(dentry, inode); 603 d_tmpfile(dentry, inode);
609 } 604 }
605 /* link_count was changed by d_tmpfile as well. */
606 f2fs_unlock_op(sbi);
610 unlock_new_inode(inode); 607 unlock_new_inode(inode);
611 return 0; 608 return 0;
612 609
@@ -704,12 +701,10 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
704 new_inode->i_ctime = CURRENT_TIME; 701 new_inode->i_ctime = CURRENT_TIME;
705 down_write(&F2FS_I(new_inode)->i_sem); 702 down_write(&F2FS_I(new_inode)->i_sem);
706 if (old_dir_entry) 703 if (old_dir_entry)
707 drop_nlink(new_inode); 704 f2fs_i_links_write(new_inode, false);
708 drop_nlink(new_inode); 705 f2fs_i_links_write(new_inode, false);
709 up_write(&F2FS_I(new_inode)->i_sem); 706 up_write(&F2FS_I(new_inode)->i_sem);
710 707
711 mark_inode_dirty(new_inode);
712
713 if (!new_inode->i_nlink) 708 if (!new_inode->i_nlink)
714 add_orphan_inode(sbi, new_inode->i_ino); 709 add_orphan_inode(sbi, new_inode->i_ino);
715 else 710 else
@@ -729,7 +724,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
729 } 724 }
730 725
731 if (old_dir_entry) { 726 if (old_dir_entry) {
732 inc_nlink(new_dir); 727 f2fs_i_links_write(new_dir, true);
733 update_inode_page(new_dir); 728 update_inode_page(new_dir);
734 } 729 }
735 730
@@ -784,8 +779,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
784 f2fs_dentry_kunmap(old_inode, old_dir_page); 779 f2fs_dentry_kunmap(old_inode, old_dir_page);
785 f2fs_put_page(old_dir_page, 0); 780 f2fs_put_page(old_dir_page, 0);
786 } 781 }
787 drop_nlink(old_dir); 782 f2fs_i_links_write(old_dir, false);
788 mark_inode_dirty(old_dir);
789 update_inode_page(old_dir); 783 update_inode_page(old_dir);
790 } 784 }
791 785
@@ -913,10 +907,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
913 old_dir->i_ctime = CURRENT_TIME; 907 old_dir->i_ctime = CURRENT_TIME;
914 if (old_nlink) { 908 if (old_nlink) {
915 down_write(&F2FS_I(old_dir)->i_sem); 909 down_write(&F2FS_I(old_dir)->i_sem);
916 if (old_nlink < 0) 910 f2fs_i_links_write(old_dir, old_nlink > 0);
917 drop_nlink(old_dir);
918 else
919 inc_nlink(old_dir);
920 up_write(&F2FS_I(old_dir)->i_sem); 911 up_write(&F2FS_I(old_dir)->i_sem);
921 } 912 }
922 mark_inode_dirty(old_dir); 913 mark_inode_dirty(old_dir);
@@ -934,10 +925,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
934 new_dir->i_ctime = CURRENT_TIME; 925 new_dir->i_ctime = CURRENT_TIME;
935 if (new_nlink) { 926 if (new_nlink) {
936 down_write(&F2FS_I(new_dir)->i_sem); 927 down_write(&F2FS_I(new_dir)->i_sem);
937 if (new_nlink < 0) 928 f2fs_i_links_write(new_dir, new_nlink > 0);
938 drop_nlink(new_dir);
939 else
940 inc_nlink(new_dir);
941 up_write(&F2FS_I(new_dir)->i_sem); 929 up_write(&F2FS_I(new_dir)->i_sem);
942 } 930 }
943 mark_inode_dirty(new_dir); 931 mark_inode_dirty(new_dir);