struct dnode_of_data dn;
        struct node_info ni;
        bool ipu_force = false;
+       bool atomic_commit;
        int err = 0;
 
        /* Use COW inode to make dnode_of_data for atomic write */
-       if (f2fs_is_atomic_file(inode))
+       atomic_commit = f2fs_is_atomic_file(inode) &&
+                               page_private_atomic(fio->page);
+       if (atomic_commit)
                set_new_dnode(&dn, F2FS_I(inode)->cow_inode, NULL, NULL, 0);
        else
                set_new_dnode(&dn, inode, NULL, NULL, 0);
        f2fs_outplace_write_data(&dn, fio);
        trace_f2fs_do_write_data_page(page_folio(page), OPU);
        set_inode_flag(inode, FI_APPEND_WRITE);
+       if (atomic_commit)
+               clear_page_private_atomic(page);
 out_writepage:
        f2fs_put_dnode(&dn);
 out:
 
        set_page_dirty(page);
 
+       if (f2fs_is_atomic_file(inode))
+               set_page_private_atomic(page);
+
        if (pos + copied > i_size_read(inode) &&
            !f2fs_verity_in_progress(inode)) {
                f2fs_i_size_write(inode, pos + copied);
 
  * bit 1       PAGE_PRIVATE_ONGOING_MIGRATION
  * bit 2       PAGE_PRIVATE_INLINE_INODE
  * bit 3       PAGE_PRIVATE_REF_RESOURCE
- * bit 4-      f2fs private data
+ * bit 4       PAGE_PRIVATE_ATOMIC_WRITE
+ * bit 5-      f2fs private data
  *
  * Layout B: lowest bit should be 0
  * page.private is a wrapped pointer.
        PAGE_PRIVATE_ONGOING_MIGRATION,         /* data page which is on-going migrating */
        PAGE_PRIVATE_INLINE_INODE,              /* inode page contains inline data */
        PAGE_PRIVATE_REF_RESOURCE,              /* dirty page has referenced resources */
+       PAGE_PRIVATE_ATOMIC_WRITE,              /* data page from atomic write path */
        PAGE_PRIVATE_MAX
 };
 
 PAGE_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
 PAGE_PRIVATE_GET_FUNC(inline, INLINE_INODE);
 PAGE_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
+PAGE_PRIVATE_GET_FUNC(atomic, ATOMIC_WRITE);
 
 PAGE_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
 PAGE_PRIVATE_SET_FUNC(inline, INLINE_INODE);
 PAGE_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
+PAGE_PRIVATE_SET_FUNC(atomic, ATOMIC_WRITE);
 
 PAGE_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
 PAGE_PRIVATE_CLEAR_FUNC(inline, INLINE_INODE);
 PAGE_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
+PAGE_PRIVATE_CLEAR_FUNC(atomic, ATOMIC_WRITE);
 
 static inline unsigned long get_page_private_data(struct page *page)
 {
        clear_page_private_reference(page);
        clear_page_private_gcing(page);
        clear_page_private_inline(page);
+       clear_page_private_atomic(page);
 
        f2fs_bug_on(F2FS_P_SB(page), page_private(page));
 }