qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 03/37] blockdev: Allow creation of BDS trees without BB
Date: Fri, 23 Oct 2015 19:00:50 +0200	[thread overview]
Message-ID: <1445619684-18216-4-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1445619684-18216-1-git-send-email-kwolf@redhat.com>

From: Max Reitz <mreitz@redhat.com>

If the "id" field is missing from the options given to blockdev-add,
just omit the BlockBackend and create the BlockDriverState tree alone.

However, if "id" is missing, "node-name" must be specified; otherwise,
the BDS tree would no longer be accessible.

Many BDS options which are not parsed by bdrv_open() (like caching)
cannot be specified for these BB-less BDS trees yet. A future patch will
remove this limitation.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 blockdev.c                 | 44 +++++++++++++++++++++++++++++++-------------
 qapi/block-core.json       | 13 +++++++++----
 tests/qemu-iotests/087     |  2 +-
 tests/qemu-iotests/087.out |  4 ++--
 4 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index 27398b1..0785557 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3026,17 +3026,12 @@ out:
 void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
 {
     QmpOutputVisitor *ov = qmp_output_visitor_new();
-    BlockBackend *blk;
+    BlockDriverState *bs;
+    BlockBackend *blk = NULL;
     QObject *obj;
     QDict *qdict;
     Error *local_err = NULL;
 
-    /* Require an ID in the top level */
-    if (!options->has_id) {
-        error_setg(errp, "Block device needs an ID");
-        goto fail;
-    }
-
     /* TODO Sort it out in raw-posix and drive_new(): Reject aio=native with
      * cache.direct=false instead of silently switching to aio=threads, except
      * when called from drive_new().
@@ -3064,14 +3059,37 @@ void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
 
     qdict_flatten(qdict);
 
-    blk = blockdev_init(NULL, qdict, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
-        goto fail;
+    if (options->has_id) {
+        blk = blockdev_init(NULL, qdict, &local_err);
+        if (local_err) {
+            error_propagate(errp, local_err);
+            goto fail;
+        }
+
+        bs = blk_bs(blk);
+    } else {
+        int ret;
+
+        if (!qdict_get_try_str(qdict, "node-name")) {
+            error_setg(errp, "'id' and/or 'node-name' need to be specified for "
+                       "the root node");
+            goto fail;
+        }
+
+        bs = NULL;
+        ret = bdrv_open(&bs, NULL, NULL, qdict, BDRV_O_RDWR | BDRV_O_CACHE_WB,
+                        errp);
+        if (ret < 0) {
+            goto fail;
+        }
     }
 
-    if (bdrv_key_required(blk_bs(blk))) {
-        blk_unref(blk);
+    if (bs && bdrv_key_required(bs)) {
+        if (blk) {
+            blk_unref(blk);
+        } else {
+            bdrv_unref(bs);
+        }
         error_setg(errp, "blockdev-add doesn't support encrypted devices");
         goto fail;
     }
diff --git a/qapi/block-core.json b/qapi/block-core.json
index c042561..425fdab 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1393,9 +1393,12 @@
 #
 # @driver:        block driver name
 # @id:            #optional id by which the new block device can be referred to.
-#                 This is a required option on the top level of blockdev-add, and
-#                 currently not allowed on any other level.
-# @node-name:     #optional the name of a block driver state node (Since 2.0)
+#                 This option is only allowed on the top level of blockdev-add.
+#                 A BlockBackend will be created by blockdev-add if and only if
+#                 this option is given.
+# @node-name:     #optional the name of a block driver state node (Since 2.0).
+#                 This option is required on the top level of blockdev-add if
+#                 the @id option is not given there.
 # @discard:       #optional discard-related options (default: ignore)
 # @cache:         #optional cache-related options
 # @aio:           #optional AIO backend (default: threads)
@@ -1859,7 +1862,9 @@
 ##
 # @blockdev-add:
 #
-# Creates a new block device.
+# Creates a new block device. If the @id option is given at the top level, a
+# BlockBackend will be created; otherwise, @node-name is mandatory at the top
+# level and no BlockBackend will be created.
 #
 # This command is still a work in progress.  It doesn't support all
 # block drivers, it lacks a matching blockdev-del, and more.  Stay
diff --git a/tests/qemu-iotests/087 b/tests/qemu-iotests/087
index 8694749..af44299 100755
--- a/tests/qemu-iotests/087
+++ b/tests/qemu-iotests/087
@@ -54,7 +54,7 @@ size=128M
 _make_test_img $size
 
 echo
-echo === Missing ID ===
+echo === Missing ID and node-name ===
 echo
 
 run_qemu <<EOF
diff --git a/tests/qemu-iotests/087.out b/tests/qemu-iotests/087.out
index c509a40..7d62cd5 100644
--- a/tests/qemu-iotests/087.out
+++ b/tests/qemu-iotests/087.out
@@ -1,12 +1,12 @@
 QA output created by 087
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
 
-=== Missing ID ===
+=== Missing ID and node-name ===
 
 Testing:
 QMP_VERSION
 {"return": {}}
-{"error": {"class": "GenericError", "desc": "Block device needs an ID"}}
+{"error": {"class": "GenericError", "desc": "'id' and/or 'node-name' need to be specified for the root node"}}
 {"return": {}}
 {"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN"}
 
-- 
1.8.3.1

  parent reply	other threads:[~2015-10-23 17:01 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-23 17:00 [Qemu-devel] [PULL 00/37] Block layer patches Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 01/37] block: Remove host floppy support Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 02/37] block: Set BDRV_O_INCOMING in bdrv_fill_options() Kevin Wolf
2015-10-23 17:00 ` Kevin Wolf [this message]
2015-10-23 17:00 ` [Qemu-devel] [PULL 04/37] iotests: Only create BB if necessary Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 05/37] block: Make bdrv_is_inserted() return a bool Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 06/37] block: Add blk_is_available() Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 07/37] block: Make bdrv_is_inserted() recursive Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 08/37] block/raw_bsd: Drop raw_is_inserted() Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 09/37] block: Invoke change media CB before NULLing drv Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 10/37] hw/block/fdc: Implement tray status Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 11/37] hw/usb-storage: Check whether BB is inserted Kevin Wolf
2015-10-23 17:00 ` [Qemu-devel] [PULL 12/37] block: Fix BB AIOCB AioContext without BDS Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 13/37] block: Move guest_block_size into BlockBackend Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 14/37] block: Remove wr_highest_sector from BlockAcctStats Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 15/37] block: Move BlockAcctStats into BlockBackend Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 16/37] block: Move I/O status and error actions into BB Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 17/37] block/throttle-groups: Make incref/decref public Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 18/37] block: Add BlockBackendRootState Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 19/37] block: Make some BB functions fall back to BBRS Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 20/37] block: Fail requests to empty BlockBackend Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 21/37] block: Prepare remaining BB functions for NULL BDS Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 22/37] block: Add blk_insert_bs() Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 23/37] block: Prepare for NULL BDS Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 24/37] blockdev: Do not create BDS for empty drive Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 25/37] blockdev: Pull out blockdev option extraction Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 26/37] blockdev: Allow more options for BB-less BDS tree Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 27/37] throttle: Remove throttle_group_lock/unlock() Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 28/37] aio: Add "is_external" flag for event handlers Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 29/37] nbd: Mark fd handlers client type as "external" Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 30/37] dataplane: Mark host notifiers' " Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 31/37] aio: introduce aio_{disable, enable}_external Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 32/37] block: Introduce "drained begin/end" API Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 33/37] block: Add "drained begin/end" for transactional external snapshot Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 34/37] block: Add "drained begin/end" for transactional backup Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 35/37] block: Add "drained begin/end" for transactional blockdev-backup Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 36/37] block: Add "drained begin/end" for internal snapshot Kevin Wolf
2015-10-23 17:01 ` [Qemu-devel] [PULL 37/37] tests: Add test case for aio_disable_external Kevin Wolf
2015-10-26  9:44 ` [Qemu-devel] [PULL 00/37] Block layer patches Peter Maydell

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=1445619684-18216-4-git-send-email-kwolf@redhat.com \
    --to=kwolf@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).