From: MORITA Kazutaka Date: Tue, 26 Jun 2012 22:26:23 +0000 (+0900) Subject: sheepdog: traverse pending_list from the first for each time X-Git-Tag: TizenStudio_2.0_p2.3.2~208^2~3913^2~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7dc1cde05bd8c63789edc03fedb71d2d68da1d4f;p=sdk%2Femulator%2Fqemu.git sheepdog: traverse pending_list from the first for each time The pending list can be modified in other coroutine context sd_co_rw_vector, so we need to traverse the list from the first again after we send the pending request. Signed-off-by: MORITA Kazutaka Signed-off-by: Kevin Wolf --- diff --git a/block/sheepdog.c b/block/sheepdog.c index f6cd517..6e73efb 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -634,21 +634,31 @@ static int coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req, struct iovec *iov, int niov, int create, enum AIOCBState aiocb_type); + +static AIOReq *find_pending_req(BDRVSheepdogState *s, uint64_t oid) +{ + AIOReq *aio_req; + + QLIST_FOREACH(aio_req, &s->pending_aio_head, aio_siblings) { + if (aio_req->oid == oid) { + return aio_req; + } + } + + return NULL; +} + /* * This function searchs pending requests to the object `oid', and * sends them. */ static void coroutine_fn send_pending_req(BDRVSheepdogState *s, uint64_t oid) { - AIOReq *aio_req, *next; + AIOReq *aio_req; SheepdogAIOCB *acb; int ret; - QLIST_FOREACH_SAFE(aio_req, &s->pending_aio_head, aio_siblings, next) { - if (aio_req->oid != oid) { - continue; - } - + while ((aio_req = find_pending_req(s, oid)) != NULL) { acb = aio_req->aiocb; /* move aio_req from pending list to inflight one */ QLIST_REMOVE(aio_req, aio_siblings);