trans->block_rsv = rsv;
 
                ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0);
-               if (ret != -ENOSPC && ret != -EAGAIN)
+               if (ret) {
+                       trans->block_rsv = &fs_info->trans_block_rsv;
+                       btrfs_end_transaction(trans);
+                       btrfs_btree_balance_dirty(fs_info);
+                       if (ret != -ENOSPC && ret != -EAGAIN) {
+                               btrfs_orphan_del(NULL, BTRFS_I(inode));
+                               btrfs_free_block_rsv(fs_info, rsv);
+                               goto no_delete;
+                       }
+               } else {
                        break;
-
-               trans->block_rsv = &fs_info->trans_block_rsv;
-               btrfs_end_transaction(trans);
-               trans = NULL;
-               btrfs_btree_balance_dirty(fs_info);
+               }
        }
 
        btrfs_free_block_rsv(fs_info, rsv);
         * Errors here aren't a big deal, it just means we leave orphan items
         * in the tree.  They will be cleaned up on the next mount.
         */
-       if (ret == 0) {
-               trans->block_rsv = root->orphan_block_rsv;
-               btrfs_orphan_del(trans, BTRFS_I(inode));
-       } else {
-               btrfs_orphan_del(NULL, BTRFS_I(inode));
-       }
+       trans->block_rsv = root->orphan_block_rsv;
+       btrfs_orphan_del(trans, BTRFS_I(inode));
 
        trans->block_rsv = &fs_info->trans_block_rsv;
        if (!(root == fs_info->tree_root ||