[prev in list] [next in list] [prev in thread] [next in thread]
List: qemu-block
Subject: [Qemu-block] [PATCH RFC v2 20/22] block/pcache: implement pcache error handling of aio cb
From: Pavel Butsykin <pbutsykin () virtuozzo ! com>
Date: 2016-08-29 17:10:19
Message-ID: 20160829171021.4902-21-pbutsykin () virtuozzo ! com
[Download RAW message or body]
Added error handling aio requests to pcache driver. If the request fails,
then fails all pending requests.
Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
---
block/pcache.c | 33 ++++++++++++++++++++++-----------
1 file changed, 22 insertions(+), 11 deletions(-)
diff --git a/block/pcache.c b/block/pcache.c
index 7b4a9a9..c5fe689 100644
--- a/block/pcache.c
+++ b/block/pcache.c
@@ -683,7 +683,7 @@ static void pcache_aio_bh(void *opaque)
{
PrefCacheAIOCB *acb = opaque;
qemu_bh_delete(acb->bh);
- acb->common.cb(acb->common.opaque, 0);
+ acb->common.cb(acb->common.opaque, acb->ret);
qemu_aio_unref(acb);
}
@@ -696,7 +696,8 @@ static void complete_aio_request(PrefCacheAIOCB *acb)
}
}
-static void pcache_complete_acb_wait_queue(BDRVPCacheState *s, PCNode *node)
+static void pcache_complete_acb_wait_queue(BDRVPCacheState *s, PCNode *node,
+ int ret)
{
ACBEntryLink *link, *next;
@@ -710,7 +711,11 @@ static void pcache_complete_acb_wait_queue(BDRVPCacheState *s, PCNode *node)
QTAILQ_REMOVE(&node->wait.list, link, entry);
g_slice_free1(sizeof(*link), link);
- pcache_node_read_buf(wait_acb, node);
+ if (ret == 0) {
+ pcache_node_read_buf(wait_acb, node);
+ } else { /* write only fail, because next request can rewrite error */
+ wait_acb->ret = ret;
+ }
NODE_ASSERT(node->ref != 0, node);
pcache_node_unref(s, node);
@@ -753,16 +758,17 @@ static void pcache_merge_requests(PrefCacheAIOCB *acb)
assert(req != NULL);
NODE_ASSERT(node->status == NODE_WAIT_STATUS, node);
- pcache_node_submit(req);
-
- if (!(acb->aio_type & PCACHE_AIO_READAHEAD)) {
- pcache_node_read_buf(acb, node);
+ if (acb->ret == 0) {
+ pcache_node_submit(req);
+ if (!(acb->aio_type & PCACHE_AIO_READAHEAD)) {
+ pcache_node_read_buf(acb, node);
+ }
+ } else {
+ pcache_node_drop(acb->s, node);
}
+ pcache_complete_acb_wait_queue(acb->s, node, acb->ret);
- pcache_complete_acb_wait_queue(acb->s, node);
-
- pcache_node_unref(acb->s, req->node);
-
+ pcache_node_unref(acb->s, node);
g_slice_free1(sizeof(*req), req);
}
qemu_co_mutex_unlock(&acb->requests.lock);
@@ -799,6 +805,11 @@ static void pcache_aio_cb(void *opaque, int ret)
{
PrefCacheAIOCB *acb = opaque;
+ if (ret != 0) {
+ acb->ret = ret;
+ DPRINTF("pcache aio_cb(num: %jd nb: %d) err: %d",
+ acb->sector_num, acb->nb_sectors, ret);
+ }
if (acb->aio_type & PCACHE_AIO_READ) {
if (atomic_dec_fetch(&acb->requests.cnt) > 0) {
return;
--
2.8.3
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic