diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-05-20 12:43:20 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-06-02 21:05:10 -0400 |
commit | a1961246c392dbf7dabdc81b4e074c32053fbf61 (patch) | |
tree | 452d915dba0d3dffdaeeb207c59edea09228d922 /fs/f2fs | |
parent | 8edd03c870e4eb8d635d507a7d83fe35d76117c2 (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.c | 1 | ||||
-rw-r--r-- | fs/f2fs/dir.c | 10 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 9 | ||||
-rw-r--r-- | fs/f2fs/namei.c | 30 |
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 | ||
1560 | static 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 | |||
1560 | static inline void f2fs_i_blocks_write(struct inode *inode, | 1569 | static 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); |
357 | fail: | 354 | fail: |
@@ -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); |