This patch fixes stack frame corruption caused by a race condition between issuer and worker on the request queue.
diff --git a/core/block/vmm_blockdev.c b/core/block/vmm_blockdev.c
index 0c8b488..d32d768 100644
--- a/core/block/vmm_blockdev.c
+++ b/core/block/vmm_blockdev.c
@@ -127,7 +127,6 @@ int vmm_blockdev_complete_request(struct vmm_request *r)
vmm_spin_lock_irqsave(&rq->lock, flags);
__blockdev_done_request(rq);
vmm_spin_unlock_irqrestore(&rq->lock, flags);
- r->bdev = NULL;
return VMM_OK;
}
@@ -149,7 +148,6 @@ int vmm_blockdev_fail_request(struct vmm_request *r)
vmm_spin_lock_irqsave(&rq->lock, flags);
__blockdev_done_request(rq);
vmm_spin_unlock_irqrestore(&rq->lock, flags);
- r->bdev = NULL;
return VMM_OK;
}
@@ -268,6 +266,7 @@ static void blockdev_rw_completed(struct vmm_request *req)
return;
}
+ req->bdev = NULL;
rw->failed = FALSE;
vmm_completion_complete(&rw->done);
}
@@ -280,6 +279,7 @@ static void blockdev_rw_failed(struct vmm_request *req)
return;
}
+ req->bdev = NULL;
rw->failed = TRUE;
vmm_completion_complete(&rw->done);
}
Investigation tools
run-qemu.sh
dlist.gdb
run-qemu.gdb