*/
                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;
 
 {
        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);
        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
        }
        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);
 
        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:
         * remove all unused data of tmpfile after abnormal power-off.
         */
        add_orphan_inode(sbi, inode->i_ino);
-       f2fs_unlock_op(sbi);
-
        alloc_nid_done(sbi, inode->i_ino);
 
        if (whiteout) {
-               inode_dec_link_count(inode);
+               f2fs_i_links_write(inode, false);
                *whiteout = inode;
        } else {
                d_tmpfile(dentry, inode);
        }
+       /* link_count was changed by d_tmpfile as well. */
+       f2fs_unlock_op(sbi);
        unlock_new_inode(inode);
        return 0;
 
                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
                }
 
                if (old_dir_entry) {
-                       inc_nlink(new_dir);
+                       f2fs_i_links_write(new_dir, true);
                        update_inode_page(new_dir);
                }
 
                        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);
        }
 
        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);
        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);