[Sheepdog] [QEMU PATCH] sheepdog: add cache flush support

Christoph Hellwig hch at infradead.org
Tue Nov 15 23:06:52 CET 2011


This patch implement support for writeback-style cache in the sheepdog
protocol.  The SD_OP_FLUSH_VDI command will flush all data for the
referenced VDI to stable storage.

XXX: we'll need to figure out if the sheep server actually support this
command somehow.

Signed-off-by: Christoph Hellwig <hch at lst.de>

Index: qemu/block/sheepdog.c
===================================================================
--- qemu.orig/block/sheepdog.c	2011-11-15 15:16:41.989853638 +0100
+++ qemu/block/sheepdog.c	2011-11-15 22:58:24.516354810 +0100
@@ -29,6 +29,7 @@
 #define SD_OP_RELEASE_VDI    0x13
 #define SD_OP_GET_VDI_INFO   0x14
 #define SD_OP_READ_VDIS      0x15
+#define SD_OP_FLUSH_VDI      0x16
 
 #define SD_FLAG_CMD_WRITE    0x01
 #define SD_FLAG_CMD_COW      0x02
@@ -261,6 +262,7 @@ typedef struct AIOReq {
 enum AIOCBState {
     AIOCB_WRITE_UDATA,
     AIOCB_READ_UDATA,
+    AIOCB_FLUSH_CACHE,
 };
 
 struct SheepdogAIOCB {
@@ -813,6 +815,9 @@ static void coroutine_fn aio_read_respon
     acb = aio_req->aiocb;
 
     switch (acb->aiocb_type) {
+    case AIOCB_FLUSH_CACHE:
+        printf("rsp.result = %d\n", rsp.result);
+        break;
     case AIOCB_WRITE_UDATA:
         if (!is_data_obj(aio_req->oid)) {
             break;
@@ -1084,7 +1089,11 @@ static int coroutine_fn add_aio_request(
 
     memset(&hdr, 0, sizeof(hdr));
 
-    if (aiocb_type == AIOCB_READ_UDATA) {
+    if (aiocb_type == AIOCB_FLUSH_CACHE) {
+        wlen = 0;
+        hdr.opcode = SD_OP_FLUSH_VDI;
+        hdr.flags = SD_FLAG_CMD_WRITE | flags;
+    } else if (aiocb_type == AIOCB_READ_UDATA) {
         wlen = 0;
         hdr.opcode = SD_OP_READ_OBJ;
         hdr.flags = flags;
@@ -1771,6 +1780,31 @@ static int sd_co_readv(BlockDriverState
     return acb->ret;
 }
 
+static int sd_co_flush_to_disk(BlockDriverState *bs)
+{
+    BDRVSheepdogState *s = bs->opaque;
+    SheepdogInode *inode = &s->inode;
+    SheepdogAIOCB *acb;
+    AIOReq *aio_req;
+    int ret;
+
+    acb = sd_aio_setup(bs, NULL, 0, 0, NULL, NULL);
+    acb->aiocb_type = AIOCB_FLUSH_CACHE;
+    acb->aio_done_func = sd_finish_aiocb;
+
+    aio_req = alloc_aio_req(s, acb, inode->vdi_id, 0, 0, 0, 0, 0);
+
+    ret = add_aio_request(s, aio_req, NULL, 0, 0,  acb->aiocb_type);
+    if (ret < 0) {
+        free_aio_req(s, aio_req);
+        qemu_aio_release(acb);
+        return ret;
+    }
+
+    qemu_coroutine_yield();
+    return acb->ret;
+}
+
 static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
 {
     BDRVSheepdogState *s = bs->opaque;
@@ -2100,6 +2134,7 @@ BlockDriver bdrv_sheepdog = {
 
     .bdrv_co_readv  = sd_co_readv,
     .bdrv_co_writev = sd_co_writev,
+    .bdrv_co_flush_to_disk  = sd_co_flush_to_disk,
 
     .bdrv_snapshot_create   = sd_snapshot_create,
     .bdrv_snapshot_goto     = sd_snapshot_goto,



More information about the sheepdog mailing list