vdi: Move file creation to vdi_co_create_opts

Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Max Reitz 2018-03-12 17:55:27 +01:00 committed by Kevin Wolf
parent 49858b5098
commit ec73f06071

View File

@ -721,9 +721,7 @@ nonallocating_write:
return ret; return ret;
} }
static int coroutine_fn vdi_co_do_create(const char *filename, static int coroutine_fn vdi_co_do_create(BlockdevCreateOptionsVdi *vdi_opts,
QemuOpts *file_opts,
BlockdevCreateOptionsVdi *vdi_opts,
size_t block_size, Error **errp) size_t block_size, Error **errp)
{ {
int ret = 0; int ret = 0;
@ -734,7 +732,7 @@ static int coroutine_fn vdi_co_do_create(const char *filename,
size_t i; size_t i;
size_t bmap_size; size_t bmap_size;
int64_t offset = 0; int64_t offset = 0;
Error *local_err = NULL; BlockDriverState *bs_file = NULL;
BlockBackend *blk = NULL; BlockBackend *blk = NULL;
uint32_t *bmap = NULL; uint32_t *bmap = NULL;
@ -770,18 +768,15 @@ static int coroutine_fn vdi_co_do_create(const char *filename,
goto exit; goto exit;
} }
ret = bdrv_create_file(filename, file_opts, &local_err); bs_file = bdrv_open_blockdev_ref(vdi_opts->file, errp);
if (ret < 0) { if (!bs_file) {
error_propagate(errp, local_err); ret = -EIO;
goto exit; goto exit;
} }
blk = blk_new_open(filename, NULL, NULL, blk = blk_new(BLK_PERM_WRITE | BLK_PERM_RESIZE, BLK_PERM_ALL);
BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, ret = blk_insert_bs(blk, bs_file, errp);
&local_err); if (ret < 0) {
if (blk == NULL) {
error_propagate(errp, local_err);
ret = -EIO;
goto exit; goto exit;
} }
@ -818,7 +813,7 @@ static int coroutine_fn vdi_co_do_create(const char *filename,
vdi_header_to_le(&header); vdi_header_to_le(&header);
ret = blk_pwrite(blk, offset, &header, sizeof(header), 0); ret = blk_pwrite(blk, offset, &header, sizeof(header), 0);
if (ret < 0) { if (ret < 0) {
error_setg(errp, "Error writing header to %s", filename); error_setg(errp, "Error writing header");
goto exit; goto exit;
} }
offset += sizeof(header); offset += sizeof(header);
@ -839,7 +834,7 @@ static int coroutine_fn vdi_co_do_create(const char *filename,
} }
ret = blk_pwrite(blk, offset, bmap, bmap_size, 0); ret = blk_pwrite(blk, offset, bmap, bmap_size, 0);
if (ret < 0) { if (ret < 0) {
error_setg(errp, "Error writing bmap to %s", filename); error_setg(errp, "Error writing bmap");
goto exit; goto exit;
} }
offset += bmap_size; offset += bmap_size;
@ -849,13 +844,14 @@ static int coroutine_fn vdi_co_do_create(const char *filename,
ret = blk_truncate(blk, offset + blocks * block_size, ret = blk_truncate(blk, offset + blocks * block_size,
PREALLOC_MODE_OFF, errp); PREALLOC_MODE_OFF, errp);
if (ret < 0) { if (ret < 0) {
error_prepend(errp, "Failed to statically allocate %s", filename); error_prepend(errp, "Failed to statically allocate file");
goto exit; goto exit;
} }
} }
exit: exit:
blk_unref(blk); blk_unref(blk);
bdrv_unref(bs_file);
g_free(bmap); g_free(bmap);
return ret; return ret;
} }
@ -865,6 +861,7 @@ static int coroutine_fn vdi_co_create_opts(const char *filename, QemuOpts *opts,
{ {
QDict *qdict = NULL; QDict *qdict = NULL;
BlockdevCreateOptionsVdi *create_options = NULL; BlockdevCreateOptionsVdi *create_options = NULL;
BlockDriverState *bs_file = NULL;
uint64_t block_size = DEFAULT_CLUSTER_SIZE; uint64_t block_size = DEFAULT_CLUSTER_SIZE;
Visitor *v; Visitor *v;
Error *local_err = NULL; Error *local_err = NULL;
@ -888,7 +885,19 @@ static int coroutine_fn vdi_co_create_opts(const char *filename, QemuOpts *opts,
qdict = qemu_opts_to_qdict_filtered(opts, NULL, &vdi_create_opts, true); qdict = qemu_opts_to_qdict_filtered(opts, NULL, &vdi_create_opts, true);
qdict_put_str(qdict, "file", ""); /* FIXME */ ret = bdrv_create_file(filename, opts, errp);
if (ret < 0) {
goto done;
}
bs_file = bdrv_open(filename, NULL, NULL,
BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, errp);
if (!bs_file) {
ret = -EIO;
goto done;
}
qdict_put_str(qdict, "file", bs_file->node_name);
/* Get the QAPI object */ /* Get the QAPI object */
v = qobject_input_visitor_new_keyval(QOBJECT(qdict)); v = qobject_input_visitor_new_keyval(QOBJECT(qdict));
@ -903,10 +912,11 @@ static int coroutine_fn vdi_co_create_opts(const char *filename, QemuOpts *opts,
create_options->size = ROUND_UP(create_options->size, BDRV_SECTOR_SIZE); create_options->size = ROUND_UP(create_options->size, BDRV_SECTOR_SIZE);
ret = vdi_co_do_create(filename, opts, create_options, block_size, errp); ret = vdi_co_do_create(create_options, block_size, errp);
done: done:
QDECREF(qdict); QDECREF(qdict);
qapi_free_BlockdevCreateOptionsVdi(create_options); qapi_free_BlockdevCreateOptionsVdi(create_options);
bdrv_unref(bs_file);
return ret; return ret;
} }