提交 9c678ccd 编写于 作者: A Anthony Liguori

Merge remote branch 'kwolf/for-anthony' into staging

...@@ -113,7 +113,9 @@ void qemu_aio_flush(void) ...@@ -113,7 +113,9 @@ void qemu_aio_flush(void)
qemu_aio_wait(); qemu_aio_wait();
QLIST_FOREACH(node, &aio_handlers, node) { QLIST_FOREACH(node, &aio_handlers, node) {
ret |= node->io_flush(node->opaque); if (node->io_flush) {
ret |= node->io_flush(node->opaque);
}
} }
} while (qemu_bh_poll() || ret > 0); } while (qemu_bh_poll() || ret > 0);
} }
......
...@@ -329,6 +329,11 @@ static BlockDriver *find_image_format(const char *filename) ...@@ -329,6 +329,11 @@ static BlockDriver *find_image_format(const char *filename)
ret = bdrv_file_open(&bs, filename, 0); ret = bdrv_file_open(&bs, filename, 0);
if (ret < 0) if (ret < 0)
return NULL; return NULL;
/* Return the raw BlockDriver * to scsi-generic devices */
if (bs->sg)
return bdrv_find_format("raw");
ret = bdrv_pread(bs, 0, buf, sizeof(buf)); ret = bdrv_pread(bs, 0, buf, sizeof(buf));
bdrv_delete(bs); bdrv_delete(bs);
if (ret < 0) { if (ret < 0) {
...@@ -356,6 +361,10 @@ static int refresh_total_sectors(BlockDriverState *bs, int64_t hint) ...@@ -356,6 +361,10 @@ static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
{ {
BlockDriver *drv = bs->drv; BlockDriver *drv = bs->drv;
/* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
if (bs->sg)
return 0;
/* query actual device if possible, otherwise just trust the hint */ /* query actual device if possible, otherwise just trust the hint */
if (drv->bdrv_getlength) { if (drv->bdrv_getlength) {
int64_t length = drv->bdrv_getlength(bs); int64_t length = drv->bdrv_getlength(bs);
...@@ -1929,7 +1938,19 @@ static void multiwrite_cb(void *opaque, int ret) ...@@ -1929,7 +1938,19 @@ static void multiwrite_cb(void *opaque, int ret)
static int multiwrite_req_compare(const void *a, const void *b) static int multiwrite_req_compare(const void *a, const void *b)
{ {
return (((BlockRequest*) a)->sector - ((BlockRequest*) b)->sector); const BlockRequest *req1 = a, *req2 = b;
/*
* Note that we can't simply subtract req2->sector from req1->sector
* here as that could overflow the return value.
*/
if (req1->sector > req2->sector) {
return 1;
} else if (req1->sector < req2->sector) {
return -1;
} else {
return 0;
}
} }
/* /*
......
...@@ -1244,7 +1244,7 @@ static void print_direntry(const direntry_t* direntry) ...@@ -1244,7 +1244,7 @@ static void print_direntry(const direntry_t* direntry)
int j = 0; int j = 0;
char buffer[1024]; char buffer[1024];
fprintf(stderr, "direntry 0x%x: ", (int)direntry); fprintf(stderr, "direntry %p: ", direntry);
if(!direntry) if(!direntry)
return; return;
if(is_long_name(direntry)) { if(is_long_name(direntry)) {
...@@ -1273,7 +1273,11 @@ static void print_direntry(const direntry_t* direntry) ...@@ -1273,7 +1273,11 @@ static void print_direntry(const direntry_t* direntry)
static void print_mapping(const mapping_t* mapping) static void print_mapping(const mapping_t* mapping)
{ {
fprintf(stderr, "mapping (0x%x): begin, end = %d, %d, dir_index = %d, first_mapping_index = %d, name = %s, mode = 0x%x, " , (int)mapping, mapping->begin, mapping->end, mapping->dir_index, mapping->first_mapping_index, mapping->path, mapping->mode); fprintf(stderr, "mapping (%p): begin, end = %d, %d, dir_index = %d, "
"first_mapping_index = %d, name = %s, mode = 0x%x, " ,
mapping, mapping->begin, mapping->end, mapping->dir_index,
mapping->first_mapping_index, mapping->path, mapping->mode);
if (mapping->mode & MODE_DIRECTORY) if (mapping->mode & MODE_DIRECTORY)
fprintf(stderr, "parent_mapping_index = %d, first_dir_index = %d\n", mapping->info.dir.parent_mapping_index, mapping->info.dir.first_dir_index); fprintf(stderr, "parent_mapping_index = %d, first_dir_index = %d\n", mapping->info.dir.parent_mapping_index, mapping->info.dir.first_dir_index);
else else
...@@ -2865,7 +2869,7 @@ static void checkpoint(void) { ...@@ -2865,7 +2869,7 @@ static void checkpoint(void) {
return; return;
/* avoid compiler warnings: */ /* avoid compiler warnings: */
hexdump(NULL, 100); hexdump(NULL, 100);
remove_mapping(vvv, NULL); remove_mapping(vvv, 0);
print_mapping(NULL); print_mapping(NULL);
print_direntry(NULL); print_direntry(NULL);
} }
......
...@@ -105,8 +105,10 @@ static void virtio_blk_flush_complete(void *opaque, int ret) ...@@ -105,8 +105,10 @@ static void virtio_blk_flush_complete(void *opaque, int ret)
static VirtIOBlockReq *virtio_blk_alloc_request(VirtIOBlock *s) static VirtIOBlockReq *virtio_blk_alloc_request(VirtIOBlock *s)
{ {
VirtIOBlockReq *req = qemu_mallocz(sizeof(*req)); VirtIOBlockReq *req = qemu_malloc(sizeof(*req));
req->dev = s; req->dev = s;
req->qiov.size = 0;
req->next = NULL;
return req; return req;
} }
...@@ -238,10 +240,20 @@ static void do_multiwrite(BlockDriverState *bs, BlockRequest *blkreq, ...@@ -238,10 +240,20 @@ static void do_multiwrite(BlockDriverState *bs, BlockRequest *blkreq,
} }
} }
static void virtio_blk_handle_flush(VirtIOBlockReq *req) static void virtio_blk_handle_flush(BlockRequest *blkreq, int *num_writes,
VirtIOBlockReq *req, BlockDriverState **old_bs)
{ {
BlockDriverAIOCB *acb; BlockDriverAIOCB *acb;
/*
* Make sure all outstanding writes are posted to the backing device.
*/
if (*old_bs != NULL) {
do_multiwrite(*old_bs, blkreq, *num_writes);
}
*num_writes = 0;
*old_bs = req->dev->bs;
acb = bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req); acb = bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req);
if (!acb) { if (!acb) {
virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
...@@ -314,7 +326,8 @@ static void virtio_blk_handle_request(VirtIOBlockReq *req, ...@@ -314,7 +326,8 @@ static void virtio_blk_handle_request(VirtIOBlockReq *req,
req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base; req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base;
if (req->out->type & VIRTIO_BLK_T_FLUSH) { if (req->out->type & VIRTIO_BLK_T_FLUSH) {
virtio_blk_handle_flush(req); virtio_blk_handle_flush(mrb->blkreq, &mrb->num_writes,
req, &mrb->old_bs);
} else if (req->out->type & VIRTIO_BLK_T_SCSI_CMD) { } else if (req->out->type & VIRTIO_BLK_T_SCSI_CMD) {
virtio_blk_handle_scsi(req); virtio_blk_handle_scsi(req);
} else if (req->out->type & VIRTIO_BLK_T_OUT) { } else if (req->out->type & VIRTIO_BLK_T_OUT) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册