compress_type, pages);
                }
                if (ret <= 0) {
+                       unsigned long clear_flags = EXTENT_DELALLOC |
+                               EXTENT_DEFRAG;
+                       clear_flags |= (ret < 0) ? EXTENT_DO_ACCOUNTING : 0;
+
                        /*
                         * inline extent creation worked or returned error,
                         * we don't need to create any more async work items.
                         * Unlock and free up our temp pages.
                         */
                        extent_clear_unlock_delalloc(inode, start, end, NULL,
-                                                    EXTENT_DIRTY |
-                                                    EXTENT_DELALLOC,
-                                                    PAGE_UNLOCK |
+                                                    clear_flags, PAGE_UNLOCK |
                                                     PAGE_CLEAR_DIRTY |
                                                     PAGE_SET_WRITEBACK |
                                                     PAGE_END_WRITEBACK);
 
 cleanup_and_out:
        extent_clear_unlock_delalloc(inode, start, end, NULL,
-                                    EXTENT_DIRTY | EXTENT_DELALLOC,
-                                    PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
-                                    PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK);
+                                    EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING |
+                                    EXTENT_DEFRAG, PAGE_UNLOCK |
+                                    PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
+                                    PAGE_END_WRITEBACK);
        if (!trans || IS_ERR(trans))
                btrfs_error(root->fs_info, ret, "Failed to join transaction");
        else
                extent_clear_unlock_delalloc(inode, async_extent->start,
                                async_extent->start +
                                async_extent->ram_size - 1,
-                               NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
-                               EXTENT_DIRTY, PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
+                               NULL, EXTENT_LOCKED | EXTENT_DELALLOC,
+                               PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
                                PAGE_SET_WRITEBACK);
                ret = btrfs_submit_compressed_write(inode,
                                    async_extent->start,
                                     async_extent->start +
                                     async_extent->ram_size - 1,
                                     NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
-                                    EXTENT_DIRTY, PAGE_UNLOCK |
-                                    PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
-                                    PAGE_END_WRITEBACK);
+                                    EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING,
+                                    PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
+                                    PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK);
        kfree(async_extent);
        goto again;
 }
                if (ret == 0) {
                        extent_clear_unlock_delalloc(inode, start, end, NULL,
                                     EXTENT_LOCKED | EXTENT_DELALLOC |
-                                    EXTENT_DIRTY, PAGE_UNLOCK |
+                                    EXTENT_DEFRAG, PAGE_UNLOCK |
                                     PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
                                     PAGE_END_WRITEBACK);
 
        btrfs_free_reserved_extent(root, ins.objectid, ins.offset);
 out_unlock:
        extent_clear_unlock_delalloc(inode, start, end, locked_page,
-                                    EXTENT_LOCKED | EXTENT_DIRTY |
-                                    EXTENT_DELALLOC, PAGE_UNLOCK |
-                                    PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
-                                    PAGE_END_WRITEBACK);
+                                    EXTENT_LOCKED | EXTENT_DO_ACCOUNTING |
+                                    EXTENT_DELALLOC | EXTENT_DEFRAG,
+                                    PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
+                                    PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK);
        goto out;
 }
 
        if (IS_ERR(trans)) {
                extent_clear_unlock_delalloc(inode, start, end, locked_page,
                                             EXTENT_LOCKED | EXTENT_DELALLOC |
-                                            EXTENT_DIRTY, PAGE_UNLOCK |
+                                            EXTENT_DO_ACCOUNTING |
+                                            EXTENT_DEFRAG, PAGE_UNLOCK |
                                             PAGE_CLEAR_DIRTY |
                                             PAGE_SET_WRITEBACK |
                                             PAGE_END_WRITEBACK);
        if (!path) {
                extent_clear_unlock_delalloc(inode, start, end, locked_page,
                                             EXTENT_LOCKED | EXTENT_DELALLOC |
-                                            EXTENT_DIRTY, PAGE_UNLOCK |
+                                            EXTENT_DO_ACCOUNTING |
+                                            EXTENT_DEFRAG, PAGE_UNLOCK |
                                             PAGE_CLEAR_DIRTY |
                                             PAGE_SET_WRITEBACK |
                                             PAGE_END_WRITEBACK);
        if (IS_ERR(trans)) {
                extent_clear_unlock_delalloc(inode, start, end, locked_page,
                                             EXTENT_LOCKED | EXTENT_DELALLOC |
-                                            EXTENT_DIRTY, PAGE_UNLOCK |
+                                            EXTENT_DO_ACCOUNTING |
+                                            EXTENT_DEFRAG, PAGE_UNLOCK |
                                             PAGE_CLEAR_DIRTY |
                                             PAGE_SET_WRITEBACK |
                                             PAGE_END_WRITEBACK);
        if (ret && cur_offset < end)
                extent_clear_unlock_delalloc(inode, cur_offset, end,
                                             locked_page, EXTENT_LOCKED |
-                                            EXTENT_DELALLOC | EXTENT_DIRTY,
-                                            PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
+                                            EXTENT_DELALLOC | EXTENT_DEFRAG |
+                                            EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
+                                            PAGE_CLEAR_DIRTY |
                                             PAGE_SET_WRITEBACK |
                                             PAGE_END_WRITEBACK);
        btrfs_free_path(path);