At Tue, 15 Nov 2011 17:06:52 -0500, Christoph Hellwig wrote: > > 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. If we increment SD_PROTO_VER, the sheep daemon should return SD_RES_VER_MISMATCH error when opening the VDI. Thanks, Kazutaka > > 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, > -- > sheepdog mailing list > sheepdog at lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog |