提交 7dc1cde0 编写于 作者: M MORITA Kazutaka 提交者: Kevin Wolf

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: NMORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 c292ee6a
...@@ -634,21 +634,31 @@ static int coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req, ...@@ -634,21 +634,31 @@ static int coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
struct iovec *iov, int niov, int create, struct iovec *iov, int niov, int create,
enum AIOCBState aiocb_type); 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 * This function searchs pending requests to the object `oid', and
* sends them. * sends them.
*/ */
static void coroutine_fn send_pending_req(BDRVSheepdogState *s, uint64_t oid) static void coroutine_fn send_pending_req(BDRVSheepdogState *s, uint64_t oid)
{ {
AIOReq *aio_req, *next; AIOReq *aio_req;
SheepdogAIOCB *acb; SheepdogAIOCB *acb;
int ret; int ret;
QLIST_FOREACH_SAFE(aio_req, &s->pending_aio_head, aio_siblings, next) { while ((aio_req = find_pending_req(s, oid)) != NULL) {
if (aio_req->oid != oid) {
continue;
}
acb = aio_req->aiocb; acb = aio_req->aiocb;
/* move aio_req from pending list to inflight one */ /* move aio_req from pending list to inflight one */
QLIST_REMOVE(aio_req, aio_siblings); QLIST_REMOVE(aio_req, aio_siblings);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册