if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags))
                return;
 
+       /*
+        * Long running balances can keep us blocked here for eternity, so
+        * simply skip deletion if we're unable to get the mutex.
+        */
+       if (!mutex_trylock(&fs_info->delete_unused_bgs_mutex))
+               return;
+
        spin_lock(&fs_info->unused_bgs_lock);
        while (!list_empty(&fs_info->unused_bgs)) {
                int trimming;
 
                btrfs_discard_cancel_work(&fs_info->discard_ctl, block_group);
 
-               mutex_lock(&fs_info->delete_unused_bgs_mutex);
-
                /* Don't want to race with allocators so take the groups_sem */
                down_write(&space_info->groups_sem);
 
 end_trans:
                btrfs_end_transaction(trans);
 next:
-               mutex_unlock(&fs_info->delete_unused_bgs_mutex);
                btrfs_put_block_group(block_group);
                spin_lock(&fs_info->unused_bgs_lock);
        }
        spin_unlock(&fs_info->unused_bgs_lock);
+       mutex_unlock(&fs_info->delete_unused_bgs_mutex);
        return;
 
 flip_async: