From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, mreitz@redhat.com, pkrempa@redhat.com,
eblake@redhat.com, jcody@redhat.com, jdurgin@redhat.com,
mitake.hitoshi@lab.ntt.co.jp, namei.unix@gmail.com,
qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH v4 27/37] nfs: Support .bdrv_co_create
Date: Wed, 7 Mar 2018 19:59:36 +0100 [thread overview]
Message-ID: <20180307185946.29366-28-kwolf@redhat.com> (raw)
In-Reply-To: <20180307185946.29366-1-kwolf@redhat.com>
This adds the .bdrv_co_create driver callback to nfs, which enables
image creation over QMP.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
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
next prev parent reply other threads:[~2018-03-07 19:00 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-07 18:59 [Qemu-devel] [PATCH v4 00/37] x-blockdev-create for protocols and qcow2 Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 01/37] block/qapi: Introduce BlockdevCreateOptions Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 02/37] block/qapi: Add qcow2 create options to schema Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 03/37] qcow2: Rename qcow2_co_create2() to qcow2_co_create() Kevin Wolf
2018-03-07 19:13 ` Max Reitz
2018-03-07 19:15 ` Eric Blake
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 04/37] qcow2: Let qcow2_create() handle protocol layer Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 05/37] qcow2: Pass BlockdevCreateOptions to qcow2_co_create() Kevin Wolf
2018-03-07 19:41 ` Eric Blake
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 06/37] qcow2: Use BlockdevRef in qcow2_co_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 07/37] qcow2: Use QCryptoBlockCreateOptions " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 08/37] qcow2: Handle full/falloc preallocation " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 09/37] util: Add qemu_opts_to_qdict_filtered() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 10/37] test-qemu-opts: Test qemu_opts_append() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 11/37] test-qemu-opts: Test qemu_opts_to_qdict_filtered() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 12/37] qdict: Introduce qdict_rename_keys() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 13/37] qcow2: Use visitor for options in qcow2_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 14/37] block: Make bdrv_is_whitelisted() public Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 15/37] block: x-blockdev-create QMP command Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 16/37] file-posix: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 17/37] file-win32: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 18/37] gluster: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 19/37] rbd: Fix use after free in qemu_rbd_set_keypairs() error path Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 20/37] rbd: Factor out qemu_rbd_connect() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 21/37] rbd: Remove non-schema options from runtime_opts Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 22/37] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect() Kevin Wolf
2018-03-07 19:28 ` Max Reitz
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 23/37] rbd: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 24/37] rbd: Assign s->snap/image_name in qemu_rbd_open() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 25/37] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 26/37] nfs: Use QAPI options in nfs_client_open() Kevin Wolf
2018-03-07 18:59 ` Kevin Wolf [this message]
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 28/37] sheepdog: QAPIfy "redundancy" create option Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 29/37] sheepdog: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 30/37] ssh: Use QAPI BlockdevOptionsSsh object Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 31/37] ssh: QAPIfy host-key-check option Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 32/37] ssh: Pass BlockdevOptionsSsh to connect_to_ssh() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 33/37] ssh: Support .bdrv_co_create Kevin Wolf
2018-03-07 19:40 ` Max Reitz
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 34/37] file-posix: Fix no-op bdrv_truncate() with falloc preallocation Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 35/37] block: Fail bdrv_truncate() with negative size Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 36/37] qemu-iotests: Test qcow2 over file image creation with QMP Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 37/37] qemu-iotests: Test ssh image creation over QMP Kevin Wolf
2018-03-07 19:38 ` [Qemu-devel] [PATCH v4 00/37] x-blockdev-create for protocols and qcow2 no-reply
2018-03-08 10:21 ` Daniel P. Berrangé
2018-03-08 11:25 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180307185946.29366-28-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=eblake@redhat.com \
--cc=jcody@redhat.com \
--cc=jdurgin@redhat.com \
--cc=mitake.hitoshi@lab.ntt.co.jp \
--cc=mreitz@redhat.com \
--cc=namei.unix@gmail.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.