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:
parent
49858b5098
commit
ec73f06071
46
block/vdi.c
46
block/vdi.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user