/* As we may drop ->uring_lock, other task may have started quiesce */
        if (data->quiesce)
                return -ENXIO;
+       ret = io_rsrc_node_switch_start(ctx);
+       if (ret)
+               return ret;
+       io_rsrc_node_switch(ctx, data);
+
+       /* kill initial ref, already quiesced if zero */
+       if (atomic_dec_and_test(&data->refs))
+               return 0;
 
        data->quiesce = true;
+       mutex_unlock(&ctx->uring_lock);
        do {
-               ret = io_rsrc_node_switch_start(ctx);
-               if (ret)
-                       break;
-               io_rsrc_node_switch(ctx, data);
-
-               /* kill initial ref, already quiesced if zero */
-               if (atomic_dec_and_test(&data->refs))
-                       break;
-               mutex_unlock(&ctx->uring_lock);
-
                ret = io_run_task_work_sig(ctx);
-               if (ret < 0)
-                       goto reinit;
+               if (ret < 0) {
+                       atomic_inc(&data->refs);
+                       /* wait for all works potentially completing data->done */
+                       flush_delayed_work(&ctx->rsrc_put_work);
+                       reinit_completion(&data->done);
+                       mutex_lock(&ctx->uring_lock);
+                       break;
+               }
 
                flush_delayed_work(&ctx->rsrc_put_work);
                ret = wait_for_completion_interruptible(&data->done);
                         */
                        mutex_unlock(&ctx->uring_lock);
                }
-reinit:
-               atomic_inc(&data->refs);
-               /* wait for all works potentially completing data->done */
-               flush_delayed_work(&ctx->rsrc_put_work);
-               reinit_completion(&data->done);
-
-               mutex_lock(&ctx->uring_lock);
-       } while (ret >= 0);
+       } while (1);
        data->quiesce = false;
 
        return ret;