minios: blkfront_aio_poll may reenter

if the callback calls blkfront_sync for instance.
In such a case, we would see responses and hence release grants
several times. We need to be more synchronous and stop when we detect
that we have re-entered.
This fixes HVM restore with stubdomains.

Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
This commit is contained in:
Keir Fraser committed 2008-03-26 13:15:00 +00:00
1 parent aecea1aa65
commit d3ca7ebecc
2 files changed
+16 -13

No files matched your search

+12 -9
View File
@@ -319,6 +319,7 @@ int blkfront_aio_poll(struct blkfront_dev *dev)
{
RING_IDX rp, cons;
struct blkif_response *rsp;
int more;
moretodo:
#ifdef HAVE_LIBC
@@ -334,6 +335,7 @@ moretodo:
while ((cons != rp))
{
rsp = RING_GET_RESPONSE(&dev->ring, cons);
nr_consumed++;
if (rsp->status != BLKIF_RSP_OKAY)
printk("block error %d for op %d\n", rsp->status, rsp->operation);
@@ -343,29 +345,30 @@ moretodo:
case BLKIF_OP_WRITE:
{
struct blkfront_aiocb *aiocbp = (void*) (uintptr_t) rsp->id;
int status = rsp->status;
int j;
for (j = 0; j < aiocbp->n; j++)
gnttab_end_access(aiocbp->gref[j]);
dev->ring.rsp_cons = ++cons;
/* Nota: callback frees aiocbp itself */
aiocbp->aio_cb(aiocbp, rsp->status ? -EIO : 0);
aiocbp->aio_cb(aiocbp, status ? -EIO : 0);
if (dev->ring.rsp_cons != cons)
/* We reentered, we must not continue here */
goto out;
break;
}
case BLKIF_OP_WRITE_BARRIER:
case BLKIF_OP_FLUSH_DISKCACHE:
break;
default:
printk("unrecognized block operation %d response\n", rsp->operation);
case BLKIF_OP_WRITE_BARRIER:
case BLKIF_OP_FLUSH_DISKCACHE:
dev->ring.rsp_cons = ++cons;
break;
}
nr_consumed++;
++cons;
}
dev->ring.rsp_cons = cons;
int more;
out:
RING_FINAL_CHECK_FOR_RESPONSES(&dev->ring, more);
if (more) goto moretodo;
+4 -4
View File
@@ -16,10 +16,10 @@ DEF_LDFLAGS =
ifeq ($(debug),y)
DEF_CFLAGS += -g
#DEF_CFLAGS += MM_DEBUG
#DEF_CFLAGS += FS_DEBUG
#DEF_CFLAGS += LIBC_DEBUG
#DEF_CFLAGS += GNT_DEBUG
#DEF_CFLAGS += -DMM_DEBUG
#DEF_CFLAGS += -DFS_DEBUG
#DEF_CFLAGS += -DLIBC_DEBUG
DEF_CFLAGS += -DGNT_DEBUG
else
DEF_CFLAGS += -O3
endif
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.