At Tue, 3 Apr 2012 16:35:00 +0800, Liu Yuan wrote: > > +static int coroutine_fn sd_co_flush_to_disk(BlockDriverState *bs) > +{ > + BDRVSheepdogState *s = bs->opaque; > + SheepdogObjReq hdr = { 0 }; > + SheepdogObjRsp *rsp = (SheepdogObjRsp *)&hdr; > + SheepdogInode *inode = &s->inode; > + int ret; > + unsigned int wlen = 0, rlen = 0; > + > + if (!s->cache_enabled) { > + return 0; > + } > + > + hdr.opcode = SD_OP_FLUSH_VDI; > + hdr.oid = vid_to_vdi_oid(inode->vdi_id); > + > + ret = do_co_req(s->fd, (SheepdogReq *)&hdr, NULL, &wlen, &rlen);
This will mix the flush request with I/O requests on s->fd. We can read s->fd only in aio_read_response() and write only in add_aio_request(), so please create another connection for flush operations. Thanks, Kazutaka