else
                        inode_dec_dirty_pages(inode);
        }
+
+       /* This is atomic written page, keep Private */
+       if (IS_ATOMIC_WRITTEN_PAGE(page))
+               return;
+
        ClearPagePrivate(page);
 }
 
        if (PageDirty(page))
                return 0;
 
+       /* This is atomic written page, keep Private */
+       if (IS_ATOMIC_WRITTEN_PAGE(page))
+               return 0;
+
        ClearPagePrivate(page);
        return 1;
 }
        SetPageUptodate(page);
 
        if (f2fs_is_atomic_file(inode)) {
-               register_inmem_page(inode, page);
-               return 1;
+               if (!IS_ATOMIC_WRITTEN_PAGE(page)) {
+                       register_inmem_page(inode, page);
+                       return 1;
+               }
+               /*
+                * Previously, this page has been registered, we just
+                * return here.
+                */
+               return 0;
        }
 
        if (!PageDirty(page)) {
 
 {
        struct f2fs_inode_info *fi = F2FS_I(inode);
        struct inmem_pages *new;
-       int err;
 
-       SetPagePrivate(page);
        f2fs_trace_pid(page);
 
+       set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
+       SetPagePrivate(page);
+
        new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
 
        /* add atomic page indices to the list */
        new->page = page;
        INIT_LIST_HEAD(&new->list);
-retry:
+
        /* increase reference count with clean state */
        mutex_lock(&fi->inmem_lock);
-       err = radix_tree_insert(&fi->inmem_root, page->index, new);
-       if (err == -EEXIST) {
-               mutex_unlock(&fi->inmem_lock);
-               kmem_cache_free(inmem_entry_slab, new);
-               return;
-       } else if (err) {
-               mutex_unlock(&fi->inmem_lock);
-               goto retry;
-       }
        get_page(page);
        list_add_tail(&new->list, &fi->inmem_pages);
        inc_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
 
        mutex_lock(&fi->inmem_lock);
        list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) {
+               lock_page(cur->page);
                if (!abort) {
-                       lock_page(cur->page);
                        if (cur->page->mapping == inode->i_mapping) {
                                set_page_dirty(cur->page);
                                f2fs_wait_on_page_writeback(cur->page, DATA);
                                        break;
                                }
                        }
-                       f2fs_put_page(cur->page, 1);
                } else {
                        trace_f2fs_commit_inmem_page(cur->page, INMEM_DROP);
-                       put_page(cur->page);
                }
-               radix_tree_delete(&fi->inmem_root, cur->page->index);
+               set_page_private(cur->page, 0);
+               ClearPagePrivate(cur->page);
+               f2fs_put_page(cur->page, 1);
+
                list_del(&cur->list);
                kmem_cache_free(inmem_entry_slab, cur);
                dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
 
        void (*allocate_segment)(struct f2fs_sb_info *, int, bool);
 };
 
+/*
+ * this value is set in page as a private data which indicate that
+ * the page is atomically written, and it is in inmem_pages list.
+ */
+#define ATOMIC_WRITTEN_PAGE            0x0000ffff
+
+#define IS_ATOMIC_WRITTEN_PAGE(page)                   \
+               (page_private(page) == (unsigned long)ATOMIC_WRITTEN_PAGE)
+
 struct inmem_pages {
        struct list_head list;
        struct page *page;