[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v3 26/36] nfs: Support .bdrv_co_create
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PATCH v3 26/36] nfs: Support .bdrv_co_create |
Date: |
Fri, 23 Feb 2018 20:25:39 +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 | 74 +++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 74 insertions(+), 16 deletions(-)
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 6c0c16ebe3..085b791303 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 9283bfbaae..c0c153cadb 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,17 +626,42 @@ static QemuOptsList nfs_create_opts = {
}
};
-static int nfs_file_create(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 nfs_file_create(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);
@@ -632,15 +669,21 @@ static int nfs_file_create(const char *url, QemuOpts
*opts, Error **errp)
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_create = nfs_file_create,
+ .bdrv_co_create = nfs_file_co_create,
.bdrv_reopen_prepare = nfs_reopen_prepare,
.bdrv_co_preadv = nfs_co_preadv,
--
2.13.6
- [Qemu-block] [PATCH v3 19/36] rbd: Factor out qemu_rbd_connect(), (continued)
- [Qemu-block] [PATCH v3 19/36] rbd: Factor out qemu_rbd_connect(), Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 21/36] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect(), Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 22/36] rbd: Support .bdrv_co_create, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 23/36] rbd: Assign s->snap/image_name in qemu_rbd_open(), Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 20/36] rbd: Remove non-schema options from runtime_opts, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 24/36] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create(), Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 25/36] nfs: Use QAPI options in nfs_client_open(), Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 26/36] nfs: Support .bdrv_co_create,
Kevin Wolf <=
- [Qemu-block] [PATCH v3 27/36] sheepdog: QAPIfy "redundancy" create option, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 28/36] sheepdog: Support .bdrv_co_create, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 29/36] ssh: Use QAPI BlockdevOptionsSsh object, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 30/36] ssh: QAPIfy host-key-check option, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 33/36] file-posix: Fix no-op bdrv_truncate() with falloc preallocation, Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 31/36] ssh: Pass BlockdevOptionsSsh to connect_to_ssh(), Kevin Wolf, 2018/02/23
- [Qemu-block] [PATCH v3 32/36] ssh: Support .bdrv_co_create, Kevin Wolf, 2018/02/23