diff --git a/block/sheepdog.c b/block/sheepdog.c
index a48f58c..6116316 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -697,6 +697,12 @@ static void coroutine_fn aio_read_response(void *opaque)
 
     acb = aio_req->aiocb;
 
+    if (rsp.result != SD_RES_SUCCESS) {
+        acb->ret = -EIO;
+        error_report("%s", sd_strerror(rsp.result));
+        goto err;
+    }
+
     switch (acb->aiocb_type) {
     case AIOCB_WRITE_UDATA:
         /* this coroutine context is no longer suitable for co_recv
@@ -736,11 +742,7 @@ static void coroutine_fn aio_read_response(void *opaque)
         break;
     }
 
-    if (rsp.result != SD_RES_SUCCESS) {
-        acb->ret = -EIO;
-        error_report("%s", sd_strerror(rsp.result));
-    }
-
+err:
     free_aio_req(s, aio_req);
     if (!acb->nr_pending) {
         /*
