int ret;
        struct btrfs_trans_handle *trans;
        u64 mask = fs_info->sectorsize - 1;
-       u64 min_size = btrfs_calc_metadata_size(fs_info, 1);
+       const u64 min_size = btrfs_calc_metadata_size(fs_info, 1);
 
        if (!skip_writeback) {
                ret = btrfs_wait_ordered_range(&inode->vfs_inode,
        /* Migrate the slack space for the truncate to our reserve */
        ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv, rsv,
                                      min_size, false);
-       BUG_ON(ret);
+       /*
+        * We have reserved 2 metadata units when we started the transaction and
+        * min_size matches 1 unit, so this should never fail, but if it does,
+        * it's not critical we just fail truncation.
+        */
+       if (WARN_ON(ret)) {
+               btrfs_end_transaction(trans);
+               goto out;
+       }
 
        trans->block_rsv = rsv;
 
                btrfs_block_rsv_release(fs_info, rsv, -1, NULL);
                ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv,
                                              rsv, min_size, false);
-               BUG_ON(ret);    /* shouldn't happen */
+               /*
+                * We have reserved 2 metadata units when we started the
+                * transaction and min_size matches 1 unit, so this should never
+                * fail, but if it does, it's not critical we just fail truncation.
+                */
+               if (WARN_ON(ret))
+                       break;
+
                trans->block_rsv = rsv;
        }