@@ -349,9 +349,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
349349 f2fs_delete_entry (de , page , dir , inode );
350350 f2fs_unlock_op (sbi );
351351
352- /* In order to evict this inode, we set it dirty */
353- mark_inode_dirty (inode );
354-
355352 if (IS_DIRSYNC (dir ))
356353 f2fs_sync_fs (sbi -> sb , 1 );
357354fail :
@@ -597,16 +594,16 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
597594 * remove all unused data of tmpfile after abnormal power-off.
598595 */
599596 add_orphan_inode (sbi , inode -> i_ino );
600- f2fs_unlock_op (sbi );
601-
602597 alloc_nid_done (sbi , inode -> i_ino );
603598
604599 if (whiteout ) {
605- inode_dec_link_count (inode );
600+ f2fs_i_links_write (inode , false );
606601 * whiteout = inode ;
607602 } else {
608603 d_tmpfile (dentry , inode );
609604 }
605+ /* link_count was changed by d_tmpfile as well. */
606+ f2fs_unlock_op (sbi );
610607 unlock_new_inode (inode );
611608 return 0 ;
612609
@@ -704,12 +701,10 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
704701 new_inode -> i_ctime = CURRENT_TIME ;
705702 down_write (& F2FS_I (new_inode )-> i_sem );
706703 if (old_dir_entry )
707- drop_nlink (new_inode );
708- drop_nlink (new_inode );
704+ f2fs_i_links_write (new_inode , false );
705+ f2fs_i_links_write (new_inode , false );
709706 up_write (& F2FS_I (new_inode )-> i_sem );
710707
711- mark_inode_dirty (new_inode );
712-
713708 if (!new_inode -> i_nlink )
714709 add_orphan_inode (sbi , new_inode -> i_ino );
715710 else
@@ -729,7 +724,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
729724 }
730725
731726 if (old_dir_entry ) {
732- inc_nlink (new_dir );
727+ f2fs_i_links_write (new_dir , true );
733728 update_inode_page (new_dir );
734729 }
735730
@@ -784,8 +779,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
784779 f2fs_dentry_kunmap (old_inode , old_dir_page );
785780 f2fs_put_page (old_dir_page , 0 );
786781 }
787- drop_nlink (old_dir );
788- mark_inode_dirty (old_dir );
782+ f2fs_i_links_write (old_dir , false);
789783 update_inode_page (old_dir );
790784 }
791785
@@ -913,10 +907,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
913907 old_dir -> i_ctime = CURRENT_TIME ;
914908 if (old_nlink ) {
915909 down_write (& F2FS_I (old_dir )-> i_sem );
916- if (old_nlink < 0 )
917- drop_nlink (old_dir );
918- else
919- inc_nlink (old_dir );
910+ f2fs_i_links_write (old_dir , old_nlink > 0 );
920911 up_write (& F2FS_I (old_dir )-> i_sem );
921912 }
922913 mark_inode_dirty (old_dir );
@@ -934,10 +925,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
934925 new_dir -> i_ctime = CURRENT_TIME ;
935926 if (new_nlink ) {
936927 down_write (& F2FS_I (new_dir )-> i_sem );
937- if (new_nlink < 0 )
938- drop_nlink (new_dir );
939- else
940- inc_nlink (new_dir );
928+ f2fs_i_links_write (new_dir , new_nlink > 0 );
941929 up_write (& F2FS_I (new_dir )-> i_sem );
942930 }
943931 mark_inode_dirty (new_dir );
0 commit comments