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 v3 26/36] nfs: Support .bdrv_co_create
Date: Fri, 23 Feb 2018 20:25:39 +0100 [thread overview]
Message-ID: <20180223192549.26666-27-kwolf@redhat.com> (raw)
In-Reply-To: <20180223192549.26666-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 | 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
next prev parent reply other threads:[~2018-02-23 19:26 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-23 19:25 [Qemu-devel] [PATCH v3 00/36] x-blockdev-create for protocols and qcow2 Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 01/36] block/qapi: Introduce BlockdevCreateOptions Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 02/36] block/qapi: Add qcow2 create options to schema Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 03/36] qcow2: Let qcow2_create() handle protocol layer Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 04/36] qcow2: Pass BlockdevCreateOptions to qcow2_create2() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 05/36] qcow2: Use BlockdevRef in qcow2_create2() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 06/36] qcow2: Use QCryptoBlockCreateOptions " Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 07/36] qcow2: Handle full/falloc preallocation " Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 08/36] util: Add qemu_opts_to_qdict_filtered() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 09/36] test-qemu-opts: Test qemu_opts_append() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 10/36] test-qemu-opts: Test qemu_opts_to_qdict_filtered() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 11/36] qdict: Introduce qdict_rename_keys() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 12/36] qcow2: Use visitor for options in qcow2_create() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 13/36] block: Make bdrv_is_whitelisted() public Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 14/36] block: x-blockdev-create QMP command Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 15/36] file-posix: Support .bdrv_co_create Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 16/36] file-win32: " Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 17/36] gluster: " Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 18/36] rbd: Fix use after free in qemu_rbd_set_keypairs() error path Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 19/36] rbd: Factor out qemu_rbd_connect() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 20/36] rbd: Remove non-schema options from runtime_opts Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 21/36] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect() Kevin Wolf
2018-02-26 12:23 ` Max Reitz
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 22/36] rbd: Support .bdrv_co_create Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 23/36] rbd: Assign s->snap/image_name in qemu_rbd_open() Kevin Wolf
2018-02-26 12:24 ` Max Reitz
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 24/36] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create() Kevin Wolf
2018-02-26 12:25 ` Max Reitz
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 25/36] nfs: Use QAPI options in nfs_client_open() Kevin Wolf
2018-02-23 19:25 ` Kevin Wolf [this message]
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 27/36] sheepdog: QAPIfy "redundancy" create option Kevin Wolf
2018-02-26 12:28 ` Max Reitz
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 28/36] sheepdog: Support .bdrv_co_create Kevin Wolf
2018-02-26 12:30 ` Max Reitz
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 29/36] ssh: Use QAPI BlockdevOptionsSsh object Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 30/36] ssh: QAPIfy host-key-check option Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 31/36] ssh: Pass BlockdevOptionsSsh to connect_to_ssh() Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 32/36] ssh: Support .bdrv_co_create Kevin Wolf
2018-02-26 12:43 ` Max Reitz
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 33/36] file-posix: Fix no-op bdrv_truncate() with falloc preallocation Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 34/36] block: Fail bdrv_truncate() with negative size Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 35/36] qemu-iotests: Test qcow2 over file image creation with QMP Kevin Wolf
2018-02-23 19:25 ` [Qemu-devel] [PATCH v3 36/36] qemu-iotests: Test ssh image creation over QMP Kevin Wolf
2018-02-26 12:55 ` Max Reitz
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=20180223192549.26666-27-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).