2010-09-28 00:07:21 +02:00
|
|
|
Index: xen-4.0.1-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
2008-07-19 01:04:37 +02:00
|
|
|
===================================================================
|
2010-09-28 00:07:21 +02:00
|
|
|
--- xen-4.0.1-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
|
|
|
+++ xen-4.0.1-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
2010-11-19 21:15:50 +01:00
|
|
|
@@ -358,6 +358,15 @@ static void qemu_send_responses(void* op
|
2008-07-19 01:04:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
+ * Callback function for AIO flush
|
|
|
|
+ */
|
|
|
|
+static void qemu_flush_response(void* opaque, int ret) {
|
|
|
|
+ if (ret != 0) {
|
|
|
|
+ DPRINTF("aio_flush: ret = %d (%s)\n", ret, strerror(-ret));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
* Callback function for the IO message pipe. Reads requests from the ring
|
|
|
|
* and processes them (call qemu read/write functions).
|
|
|
|
*
|
2010-11-19 21:15:50 +01:00
|
|
|
@@ -376,6 +385,7 @@ static void handle_blktap_iomsg(void* pr
|
2008-07-19 01:04:37 +02:00
|
|
|
blkif_t *blkif = s->blkif;
|
|
|
|
tapdev_info_t *info = s->ring_info;
|
|
|
|
int page_size = getpagesize();
|
|
|
|
+ int sync;
|
|
|
|
|
|
|
|
struct aiocb_info *aiocb_info;
|
|
|
|
|
2010-11-19 21:15:50 +01:00
|
|
|
@@ -408,7 +418,7 @@ static void handle_blktap_iomsg(void* pr
|
2008-07-19 01:04:37 +02:00
|
|
|
|
|
|
|
/* Don't allow writes on readonly devices */
|
|
|
|
if ((s->flags & TD_RDONLY) &&
|
|
|
|
- (req->operation == BLKIF_OP_WRITE)) {
|
|
|
|
+ (req->operation != BLKIF_OP_READ)) {
|
|
|
|
blkif->pending_list[idx].status = BLKIF_RSP_ERROR;
|
|
|
|
goto send_response;
|
|
|
|
}
|
2010-11-19 21:15:50 +01:00
|
|
|
@@ -429,7 +439,7 @@ static void handle_blktap_iomsg(void* pr
|
2008-07-19 01:04:37 +02:00
|
|
|
DPRINTF("Sector request failed:\n");
|
|
|
|
DPRINTF("%s request, idx [%d,%d] size [%llu], "
|
|
|
|
"sector [%llu,%llu]\n",
|
|
|
|
- (req->operation == BLKIF_OP_WRITE ?
|
|
|
|
+ (req->operation != BLKIF_OP_READ ?
|
|
|
|
"WRITE" : "READ"),
|
|
|
|
idx,i,
|
|
|
|
(long long unsigned)
|
2010-11-19 21:15:50 +01:00
|
|
|
@@ -442,8 +452,14 @@ static void handle_blktap_iomsg(void* pr
|
2008-07-19 01:04:37 +02:00
|
|
|
|
|
|
|
blkif->pending_list[idx].secs_pending += nsects;
|
|
|
|
|
|
|
|
- switch (req->operation)
|
|
|
|
+ sync = 0;
|
|
|
|
+ switch (req->operation)
|
|
|
|
{
|
|
|
|
+ case BLKIF_OP_WRITE_BARRIER:
|
|
|
|
+ sync = 1;
|
|
|
|
+ bdrv_aio_flush(s->bs, qemu_flush_response, NULL);
|
|
|
|
+ /* fall through */
|
|
|
|
+
|
|
|
|
case BLKIF_OP_WRITE:
|
|
|
|
aiocb_info = malloc(sizeof(*aiocb_info));
|
|
|
|
|
2010-11-19 21:15:50 +01:00
|
|
|
@@ -463,6 +479,10 @@ static void handle_blktap_iomsg(void* pr
|
2008-07-19 01:04:37 +02:00
|
|
|
DPRINTF("ERROR: bdrv_write() == NULL\n");
|
|
|
|
goto send_response;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ if (sync)
|
|
|
|
+ bdrv_aio_flush(s->bs, qemu_flush_response, NULL);
|
|
|
|
+
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BLKIF_OP_READ:
|