if (!PageUptodate(page))
                SetPageUptodate(page);
 
-       if (f2fs_is_atomic_file(inode)) {
+       if (f2fs_is_atomic_file(inode) && !f2fs_is_commit_atomic_write(inode)) {
                if (!IS_ATOMIC_WRITTEN_PAGE(page)) {
                        register_inmem_page(inode, page);
                        return 1;
 
        FI_UPDATE_WRITE,        /* inode has in-place-update data */
        FI_NEED_IPU,            /* used for ipu per file */
        FI_ATOMIC_FILE,         /* indicate atomic file */
+       FI_ATOMIC_COMMIT,       /* indicate the state of atomical committing */
        FI_VOLATILE_FILE,       /* indicate volatile file */
        FI_FIRST_BLOCK_WRITTEN, /* indicate #0 data block was written */
        FI_DROP_CACHE,          /* drop dirty page cache */
        return is_inode_flag_set(inode, FI_ATOMIC_FILE);
 }
 
+static inline bool f2fs_is_commit_atomic_write(struct inode *inode)
+{
+       return is_inode_flag_set(inode, FI_ATOMIC_COMMIT);
+}
+
 static inline bool f2fs_is_volatile_file(struct inode *inode)
 {
        return is_inode_flag_set(inode, FI_VOLATILE_FILE);
 
                goto err_out;
 
        if (f2fs_is_atomic_file(inode)) {
-               clear_inode_flag(inode, FI_ATOMIC_FILE);
                ret = commit_inmem_pages(inode);
-               if (ret) {
-                       set_inode_flag(inode, FI_ATOMIC_FILE);
+               if (ret)
                        goto err_out;
-               }
+
                ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
-               stat_dec_atomic_write(inode);
+               if (!ret) {
+                       clear_inode_flag(inode, FI_ATOMIC_FILE);
+                       stat_dec_atomic_write(inode);
+               }
        } else {
                ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
        }
 
        if (!check_valid_map(F2FS_I_SB(inode), segno, off))
                goto out;
 
+       if (f2fs_is_atomic_file(inode))
+               goto out;
+
        set_new_dnode(&dn, inode, NULL, NULL, 0);
        err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);
        if (err)
        if (!check_valid_map(F2FS_I_SB(inode), segno, off))
                goto out;
 
+       if (f2fs_is_atomic_file(inode))
+               goto out;
+
        if (gc_type == BG_GC) {
                if (PageWriteback(page))
                        goto out;
 
 {
        struct f2fs_inode_info *fi = F2FS_I(inode);
 
-       clear_inode_flag(inode, FI_ATOMIC_FILE);
-       stat_dec_atomic_write(inode);
-
        mutex_lock(&fi->inmem_lock);
        __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
        mutex_unlock(&fi->inmem_lock);
+
+       clear_inode_flag(inode, FI_ATOMIC_FILE);
+       stat_dec_atomic_write(inode);
 }
 
 static int __commit_inmem_pages(struct inode *inode,
        f2fs_balance_fs(sbi, true);
        f2fs_lock_op(sbi);
 
+       set_inode_flag(inode, FI_ATOMIC_COMMIT);
+
        mutex_lock(&fi->inmem_lock);
        err = __commit_inmem_pages(inode, &revoke_list);
        if (err) {
        }
        mutex_unlock(&fi->inmem_lock);
 
+       clear_inode_flag(inode, FI_ATOMIC_COMMIT);
+
        f2fs_unlock_op(sbi);
        return err;
 }