diff --git a/src/aws.c b/src/aws.c
index 18ad8ee518e95279b881d63375b61fae53f69ddd..e23302e0cbbdf3cc71fd8a79f2a7f0dadca9ea21 100644
--- a/src/aws.c
+++ b/src/aws.c
@@ -140,7 +140,13 @@ void connection_start_async_io(struct connection *conn)
 	/* AIO notify us when done */
 	io_set_eventfd(&conn->iocb, conn->eventfd);
 
-	io_submit(conn->ctx, 1, conn->piocb);
+	int ret = io_submit(conn->ctx, 1, conn->piocb);
+
+	if (ret < 0) {
+		connection_remove(conn);
+		return;
+	}
+
 	conn->state = STATE_ASYNC_ONGOING;
 }
 
@@ -494,12 +500,12 @@ void handle_output(struct connection *conn)
 
 		} else if (ret == 0) {
 			/* done */
-			if (conn->file_pos < conn->file_size)
-				connection_start_async_io(conn);
-			else
-				connection_remove(conn);
+			connection_remove(conn);
 
 		} else {
+			if (conn->state == STATE_ASYNC_ONGOING)
+				return;
+
 			w_epoll_update_ptr_out(epollfd, conn->sockfd, conn);
 		}