All of lore.kernel.org
 help / color / mirror / Atom feed
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 v2 03/36] qcow2: Let qcow2_create() handle protocol layer
Date: Wed, 21 Feb 2018 14:53:31 +0100	[thread overview]
Message-ID: <20180221135404.27598-4-kwolf@redhat.com> (raw)
In-Reply-To: <20180221135404.27598-1-kwolf@redhat.com>

Currently, qcow2_create() only parses the QemuOpts and then calls
qcow2_create2() for the actual image creation, which includes both the
creation of the actual file on the file system and writing a valid empty
qcow2 image into that file.

The plan is that qcow2_create2() becomes the function that implements
the functionality for a future 'blockdev-create' QMP command, which only
creates the qcow2 layer on an already opened file node.

This is a first step towards that goal: Let's move out anything that
deals with the protocol layer from qcow2_create2() into qcow2_create().
This means that qcow2_create2() doesn't need a file name any more.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 block/qcow2.c | 64 +++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 38 insertions(+), 26 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index 288b5299d8..dc6cdea113 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2725,7 +2725,7 @@ static uint64_t qcow2_opt_get_refcount_bits_del(QemuOpts *opts, int version,
     return refcount_bits;
 }
 
-static int qcow2_create2(const char *filename, int64_t total_size,
+static int qcow2_create2(BlockDriverState *bs, int64_t total_size,
                          const char *backing_file, const char *backing_format,
                          int flags, size_t cluster_size, PreallocMode prealloc,
                          QemuOpts *opts, int version, int refcount_order,
@@ -2751,28 +2751,11 @@ static int qcow2_create2(const char *filename, int64_t total_size,
     Error *local_err = NULL;
     int ret;
 
-    if (prealloc == PREALLOC_MODE_FULL || prealloc == PREALLOC_MODE_FALLOC) {
-        int64_t prealloc_size =
-            qcow2_calc_prealloc_size(total_size, cluster_size, refcount_order);
-        qemu_opt_set_number(opts, BLOCK_OPT_SIZE, prealloc_size, &error_abort);
-        qemu_opt_set(opts, BLOCK_OPT_PREALLOC, PreallocMode_str(prealloc),
-                     &error_abort);
-    }
-
-    ret = bdrv_create_file(filename, opts, &local_err);
+    blk = blk_new(BLK_PERM_WRITE | BLK_PERM_RESIZE, BLK_PERM_ALL);
+    ret = blk_insert_bs(blk, bs, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
-        return ret;
-    }
-
-    blk = blk_new_open(filename, NULL, NULL,
-                       BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL,
-                       &local_err);
-    if (blk == NULL) {
-        error_propagate(errp, local_err);
-        return -EIO;
+        goto out;
     }
-
     blk_set_allow_write_beyond_eof(blk, true);
 
     /* Write the header */
@@ -2827,7 +2810,8 @@ static int qcow2_create2(const char *filename, int64_t total_size,
      */
     options = qdict_new();
     qdict_put_str(options, "driver", "qcow2");
-    blk = blk_new_open(filename, NULL, options,
+    qdict_put_str(options, "file", bs->node_name);
+    blk = blk_new_open(NULL, NULL, options,
                        BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_NO_FLUSH,
                        &local_err);
     if (blk == NULL) {
@@ -2899,7 +2883,8 @@ static int qcow2_create2(const char *filename, int64_t total_size,
      */
     options = qdict_new();
     qdict_put_str(options, "driver", "qcow2");
-    blk = blk_new_open(filename, NULL, options,
+    qdict_put_str(options, "file", bs->node_name);
+    blk = blk_new_open(NULL, NULL, options,
                        BDRV_O_RDWR | BDRV_O_NO_BACKING | BDRV_O_NO_IO,
                        &local_err);
     if (blk == NULL) {
@@ -2929,6 +2914,7 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
     uint64_t refcount_bits;
     int refcount_order;
     char *encryptfmt = NULL;
+    BlockDriverState *bs = NULL;
     Error *local_err = NULL;
     int ret;
 
@@ -2997,12 +2983,38 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
 
     refcount_order = ctz32(refcount_bits);
 
-    ret = qcow2_create2(filename, size, backing_file, backing_fmt, flags,
+    /* Create and open the file (protocol layer) */
+    if (prealloc == PREALLOC_MODE_FULL || prealloc == PREALLOC_MODE_FALLOC) {
+        int64_t prealloc_size =
+            qcow2_calc_prealloc_size(size, cluster_size, refcount_order);
+        qemu_opt_set_number(opts, BLOCK_OPT_SIZE, prealloc_size, &error_abort);
+        qemu_opt_set(opts, BLOCK_OPT_PREALLOC, PreallocMode_str(prealloc),
+                     &error_abort);
+    }
+
+    ret = bdrv_create_file(filename, opts, errp);
+    if (ret < 0) {
+        goto finish;
+    }
+
+    bs = bdrv_open(filename, NULL, NULL,
+                   BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, errp);
+    if (bs == NULL) {
+        ret = -EIO;
+        goto finish;
+    }
+
+    /* Create the qcow2 image (format layer) */
+    ret = qcow2_create2(bs, size, backing_file, backing_fmt, flags,
                         cluster_size, prealloc, opts, version, refcount_order,
-                        encryptfmt, &local_err);
-    error_propagate(errp, local_err);
+                        encryptfmt, errp);
+    if (ret < 0) {
+        goto finish;
+    }
 
 finish:
+    bdrv_unref(bs);
+
     g_free(backing_file);
     g_free(backing_fmt);
     g_free(encryptfmt);
-- 
2.13.6

  parent reply	other threads:[~2018-02-21 13:54 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-21 13:53 [Qemu-devel] [PATCH v2 00/36] x-blockdev-create for protocols and qcow2 Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 01/36] block/qapi: Introduce BlockdevCreateOptions Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 02/36] block/qapi: Add qcow2 create options to schema Kevin Wolf
2018-02-21 13:53 ` Kevin Wolf [this message]
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 04/36] qcow2: Pass BlockdevCreateOptions to qcow2_create2() Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 05/36] qcow2: Use BlockdevRef in qcow2_create2() Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 06/36] qcow2: Use QCryptoBlockCreateOptions " Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 07/36] qcow2: Handle full/falloc preallocation " Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 08/36] util: Add qemu_opts_to_qdict_filtered() Kevin Wolf
2018-02-21 20:38   ` Eric Blake
2018-02-22 22:03   ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 09/36] test-qemu-opts: Test qemu_opts_append() Kevin Wolf
2018-02-21 20:53   ` Eric Blake
2018-02-22 22:19   ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 10/36] test-qemu-opts: Test qemu_opts_to_qdict_filtered() Kevin Wolf
2018-02-21 20:57   ` Eric Blake
2018-02-22  9:50     ` Kevin Wolf
2018-02-22 14:24       ` Eric Blake
2018-02-22 22:26   ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 11/36] qdict: Introduce qdict_rename_keys() Kevin Wolf
2018-02-22 22:40   ` Max Reitz
2018-02-22 23:13   ` Eric Blake
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 12/36] qcow2: Use visitor for options in qcow2_create() Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 13/36] block: Make bdrv_is_whitelisted() public Kevin Wolf
2018-02-22 22:45   ` Max Reitz
2018-02-22 23:17   ` Eric Blake
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 14/36] block: x-blockdev-create QMP command Kevin Wolf
2018-02-22 22:50   ` Max Reitz
2018-02-22 23:19   ` Eric Blake
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 15/36] file-posix: Support .bdrv_co_create Kevin Wolf
2018-02-22 23:34   ` Eric Blake
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 16/36] file-win32: " Kevin Wolf
2018-02-23 14:46   ` Eric Blake
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 17/36] gluster: " Kevin Wolf
2018-02-22 23:01   ` Max Reitz
2018-02-23 15:10   ` Eric Blake
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 18/36] rbd: Fix use after free in qemu_rbd_set_keypairs() error path Kevin Wolf
2018-02-22 23:02   ` Max Reitz
2018-02-23 15:15   ` Eric Blake
2018-02-23 15:56     ` Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 19/36] rbd: Factor out qemu_rbd_connect() Kevin Wolf
2018-02-22 23:10   ` Max Reitz
2018-02-23 15:19     ` Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 20/36] rbd: Remove non-schema options from runtime_opts Kevin Wolf
2018-02-22 23:13   ` Max Reitz
2018-02-22 23:16     ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 21/36] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect() Kevin Wolf
2018-02-22 23:25   ` Max Reitz
2018-02-23 16:19     ` Kevin Wolf
2018-02-23 16:43       ` Max Reitz
2018-02-23 17:09         ` Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 22/36] rbd: Support .bdrv_co_create Kevin Wolf
2018-02-22 23:30   ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 23/36] rbd: Assing s->snap/image_name in qemu_rbd_open() Kevin Wolf
2018-02-22 23:34   ` [Qemu-devel] [PATCH v2 23/36] rbd: ***ing " Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 24/36] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create() Kevin Wolf
2018-02-22 23:37   ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 25/36] nfs: Use QAPI options in nfs_client_open() Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 26/36] nfs: Support .bdrv_co_create Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 27/36] sheepdog: QAPIfy "redundacy" create option Kevin Wolf
2018-02-22 23:43   ` Max Reitz
2018-02-23 15:25   ` Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 28/36] sheepdog: Support .bdrv_co_create Kevin Wolf
2018-02-22 23:51   ` Max Reitz
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 29/36] ssh: Use QAPI BlockdevOptionsSsh object Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 30/36] ssh: QAPIfy host-key-check option Kevin Wolf
2018-02-21 13:53 ` [Qemu-devel] [PATCH v2 31/36] ssh: Pass BlockdevOptionsSsh to connect_to_ssh() Kevin Wolf
2018-02-21 13:54 ` [Qemu-devel] [PATCH v2 32/36] ssh: Support .bdrv_co_create Kevin Wolf
2018-02-26 12:40   ` Max Reitz
2018-02-26 12:40     ` Max Reitz
2018-02-21 13:54 ` [Qemu-devel] [PATCH v2 33/36] file-posix: Fix no-op bdrv_truncate() with falloc preallocation Kevin Wolf
2018-02-23 15:21   ` Eric Blake
2018-02-21 13:54 ` [Qemu-devel] [PATCH v2 34/36] block: Fail bdrv_truncate() with negative size Kevin Wolf
2018-02-22 23:35   ` Eric Blake
2018-02-21 13:54 ` [Qemu-devel] [PATCH v2 35/36] qemu-iotests: Test qcow2 over file image creation with QMP Kevin Wolf
2018-02-21 13:54 ` [Qemu-devel] [PATCH v2 36/36] qemu-iotests: Test ssh image creation over QMP Kevin Wolf
2018-02-26 12:53   ` 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=20180221135404.27598-4-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.