[prev in list] [next in list] [prev in thread] [next in thread]
List: qemu-block
Subject: [Qemu-block] [PATCH RFC v2 02/22] block/pcache: add own AIOCB block
From: Pavel Butsykin <pbutsykin () virtuozzo ! com>
Date: 2016-08-29 17:10:01
Message-ID: 20160829171021.4902-3-pbutsykin () virtuozzo ! com
[Download RAW message or body]
Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
---
block/pcache.c | 43 +++++++++++++++++++++++++++++++++++--------
1 file changed, 35 insertions(+), 8 deletions(-)
diff --git a/block/pcache.c b/block/pcache.c
index 770bbc0..74a4bc4 100644
--- a/block/pcache.c
+++ b/block/pcache.c
@@ -24,12 +24,22 @@
#include "qemu/osdep.h"
#include "block/block_int.h"
+#include "block/raw-aio.h"
#include "qapi/error.h"
#include "qapi/qmp/qstring.h"
+typedef struct PrefCacheAIOCB {
+ BlockAIOCB common;
+
+ QEMUIOVector *qiov;
+ uint64_t sector_num;
+ uint32_t nb_sectors;
+ int aio_type;
+ int ret;
+} PrefCacheAIOCB;
static const AIOCBInfo pcache_aiocb_info = {
- .aiocb_size = sizeof(BlockAIOCB),
+ .aiocb_size = sizeof(PrefCacheAIOCB),
};
static QemuOptsList runtime_opts = {
@@ -47,14 +57,29 @@ static QemuOptsList runtime_opts = {
static void pcache_aio_cb(void *opaque, int ret)
{
+ PrefCacheAIOCB *acb = opaque;
- BlockAIOCB *acb = opaque;
-
- acb->cb(acb->opaque, ret);
+ acb->common.cb(acb->common.opaque, ret);
qemu_aio_unref(acb);
}
+static PrefCacheAIOCB *pcache_aio_get(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockCompletionFunc *cb, void *opaque,
+ int type)
+{
+ PrefCacheAIOCB *acb = qemu_aio_get(&pcache_aiocb_info, bs, cb, opaque);
+
+ acb->sector_num = sector_num;
+ acb->nb_sectors = nb_sectors;
+ acb->qiov = qiov;
+ acb->aio_type = type;
+ acb->ret = 0;
+
+ return acb;
+}
+
static BlockAIOCB *pcache_aio_readv(BlockDriverState *bs,
int64_t sector_num,
QEMUIOVector *qiov,
@@ -62,11 +87,12 @@ static BlockAIOCB *pcache_aio_readv(BlockDriverState *bs,
BlockCompletionFunc *cb,
void *opaque)
{
- BlockAIOCB *acb = qemu_aio_get(&pcache_aiocb_info, bs, cb, opaque);
+ PrefCacheAIOCB *acb = pcache_aio_get(bs, sector_num, qiov, nb_sectors, cb,
+ opaque, QEMU_AIO_READ);
bdrv_aio_readv(bs->file, sector_num, qiov, nb_sectors,
pcache_aio_cb, acb);
- return acb;
+ return &acb->common;
}
static BlockAIOCB *pcache_aio_writev(BlockDriverState *bs,
@@ -76,11 +102,12 @@ static BlockAIOCB *pcache_aio_writev(BlockDriverState *bs,
BlockCompletionFunc *cb,
void *opaque)
{
- BlockAIOCB *acb = qemu_aio_get(&pcache_aiocb_info, bs, cb, opaque);
+ PrefCacheAIOCB *acb = pcache_aio_get(bs, sector_num, qiov, nb_sectors, cb,
+ opaque, QEMU_AIO_WRITE);
bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors,
pcache_aio_cb, acb);
- return acb;
+ return &acb->common;
}
static int pcache_file_open(BlockDriverState *bs, QDict *options, int flags,
--
2.8.3
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic