[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 27/37] nfs: Support .bdrv_co_create
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v4 27/37] nfs: Support .bdrv_co_create |
Date: |
Wed, 7 Mar 2018 19:59:36 +0100 |
This adds the .bdrv_co_create driver callback to nfs, which enables
image creation over QMP.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
qapi/block-core.json | 16 ++++++++++-
block/nfs.c | 76 +++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 75 insertions(+), 17 deletions(-)
diff --git a/qapi/block-core.json b/qapi/block-core.json
index d4351877fc..39e53c7791 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -3393,6 +3393,20 @@
'*preallocation': 'PreallocMode' } }
##
+# @BlockdevCreateOptionsNfs:
+#
+# Driver specific image creation options for NFS.
+#
+# @location Where to store the new image file
+# @size Size of the virtual disk in bytes
+#
+# Since: 2.12
+##
+{ 'struct': 'BlockdevCreateOptionsNfs',
+ 'data': { 'location': 'BlockdevOptionsNfs',
+ 'size': 'size' } }
+
+##
# @BlockdevQcow2Version:
#
# @v2: The original QCOW2 format as introduced in qemu 0.10 (version 2)
@@ -3491,7 +3505,7 @@
'iscsi': 'BlockdevCreateNotSupported',
'luks': 'BlockdevCreateNotSupported',
'nbd': 'BlockdevCreateNotSupported',
- 'nfs': 'BlockdevCreateNotSupported',
+ 'nfs': 'BlockdevCreateOptionsNfs',
'null-aio': 'BlockdevCreateNotSupported',
'null-co': 'BlockdevCreateNotSupported',
'nvme': 'BlockdevCreateNotSupported',
diff --git a/block/nfs.c b/block/nfs.c
index e402d643fe..2577df4b26 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -551,33 +551,45 @@ out:
return ret;
}
-static int64_t nfs_client_open_qdict(NFSClient *client, QDict *options,
- int flags, int open_flags, Error **errp)
+static BlockdevOptionsNfs *nfs_options_qdict_to_qapi(QDict *options,
+ Error **errp)
{
BlockdevOptionsNfs *opts = NULL;
QObject *crumpled = NULL;
Visitor *v;
Error *local_err = NULL;
- int ret;
crumpled = qdict_crumple(options, errp);
if (crumpled == NULL) {
- return -EINVAL;
+ return NULL;
}
v = qobject_input_visitor_new_keyval(crumpled);
visit_type_BlockdevOptionsNfs(v, NULL, &opts, &local_err);
visit_free(v);
+ qobject_decref(crumpled);
if (local_err) {
- error_propagate(errp, local_err);
+ return NULL;
+ }
+
+ return opts;
+}
+
+static int64_t nfs_client_open_qdict(NFSClient *client, QDict *options,
+ int flags, int open_flags, Error **errp)
+{
+ BlockdevOptionsNfs *opts;
+ int ret;
+
+ opts = nfs_options_qdict_to_qapi(options, errp);
+ if (opts == NULL) {
ret = -EINVAL;
goto fail;
}
ret = nfs_client_open(client, opts, flags, open_flags, errp);
fail:
- qobject_decref(crumpled);
qapi_free_BlockdevOptionsNfs(opts);
return ret;
}
@@ -614,18 +626,43 @@ static QemuOptsList nfs_create_opts = {
}
};
-static int coroutine_fn nfs_file_co_create_opts(const char *url, QemuOpts
*opts,
- Error **errp)
+static int nfs_file_co_create(BlockdevCreateOptions *options, Error **errp)
{
- int64_t ret, total_size;
+ BlockdevCreateOptionsNfs *opts = &options->u.nfs;
NFSClient *client = g_new0(NFSClient, 1);
- QDict *options = NULL;
+ int ret;
+
+ assert(options->driver == BLOCKDEV_DRIVER_NFS);
client->aio_context = qemu_get_aio_context();
+ ret = nfs_client_open(client, opts->location, O_CREAT, 0, errp);
+ if (ret < 0) {
+ goto out;
+ }
+ ret = nfs_ftruncate(client->context, client->fh, opts->size);
+ nfs_client_close(client);
+
+out:
+ g_free(client);
+ return ret;
+}
+
+static int coroutine_fn nfs_file_co_create_opts(const char *url, QemuOpts
*opts,
+ Error **errp)
+{
+ BlockdevCreateOptions *create_options;
+ BlockdevCreateOptionsNfs *nfs_opts;
+ QDict *options;
+ int ret;
+
+ create_options = g_new0(BlockdevCreateOptions, 1);
+ create_options->driver = BLOCKDEV_DRIVER_NFS;
+ nfs_opts = &create_options->u.nfs;
+
/* Read out options */
- total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
- BDRV_SECTOR_SIZE);
+ nfs_opts->size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
+ BDRV_SECTOR_SIZE);
options = qdict_new();
ret = nfs_parse_uri(url, options, errp);
@@ -633,15 +670,21 @@ static int coroutine_fn nfs_file_co_create_opts(const
char *url, QemuOpts *opts,
goto out;
}
- ret = nfs_client_open_qdict(client, options, O_CREAT, 0, errp);
+ nfs_opts->location = nfs_options_qdict_to_qapi(options, errp);
+ if (nfs_opts->location == NULL) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ ret = nfs_file_co_create(create_options, errp);
if (ret < 0) {
goto out;
}
- ret = nfs_ftruncate(client->context, client->fh, total_size);
- nfs_client_close(client);
+
+ ret = 0;
out:
QDECREF(options);
- g_free(client);
+ qapi_free_BlockdevCreateOptions(create_options);
return ret;
}
@@ -828,6 +871,7 @@ static BlockDriver bdrv_nfs = {
.bdrv_file_open = nfs_file_open,
.bdrv_close = nfs_file_close,
+ .bdrv_co_create = nfs_file_co_create,
.bdrv_co_create_opts = nfs_file_co_create_opts,
.bdrv_reopen_prepare = nfs_reopen_prepare,
--
2.13.6
- [Qemu-devel] [PATCH v4 15/37] block: x-blockdev-create QMP command, (continued)
- [Qemu-devel] [PATCH v4 15/37] block: x-blockdev-create QMP command, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 18/37] gluster: Support .bdrv_co_create, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 17/37] file-win32: Support .bdrv_co_create, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 19/37] rbd: Fix use after free in qemu_rbd_set_keypairs() error path, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 20/37] rbd: Factor out qemu_rbd_connect(), Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 21/37] rbd: Remove non-schema options from runtime_opts, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 24/37] rbd: Assign s->snap/image_name in qemu_rbd_open(), Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 22/37] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect(), Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 23/37] rbd: Support .bdrv_co_create, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 27/37] nfs: Support .bdrv_co_create,
Kevin Wolf <=
- [Qemu-devel] [PATCH v4 25/37] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create(), Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 29/37] sheepdog: Support .bdrv_co_create, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 33/37] ssh: Support .bdrv_co_create, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 28/37] sheepdog: QAPIfy "redundancy" create option, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 26/37] nfs: Use QAPI options in nfs_client_open(), Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 32/37] ssh: Pass BlockdevOptionsSsh to connect_to_ssh(), Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 34/37] file-posix: Fix no-op bdrv_truncate() with falloc preallocation, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 31/37] ssh: QAPIfy host-key-check option, Kevin Wolf, 2018/03/07
- [Qemu-devel] [PATCH v4 30/37] ssh: Use QAPI BlockdevOptionsSsh object, Kevin Wolf, 2018/03/07