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, jcody@redhat.com,
	famz@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 05/54] block: Attach bs->file only during .bdrv_open()
Date: Tue, 21 Feb 2017 15:58:01 +0100	[thread overview]
Message-ID: <1487689130-30373-6-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1487689130-30373-1-git-send-email-kwolf@redhat.com>

The way that attaching bs->file worked was a bit unusual in that it was
the only child that would be attached to a node which is not opened yet.
Because of this, the block layer couldn't know yet which permissions the
driver would eventually need.

This patch moves the point where bs->file is attached to the beginning
of the individual .bdrv_open() implementations, so drivers already know
what they are going to do with the child. This is also more consistent
with how driver-specific children work.

For a moment, bdrv_open() gets its own BdrvChild to perform image
probing, but instead of directly assigning this BdrvChild to the BDS, it
becomes a temporary one and the node name is passed as an option to the
drivers, so that they can simply use bdrv_open_child() to create another
reference for their own use.

This duplicated child for (the not opened yet) bs is not the final
state, a follow-up patch will change the image probing code to use a
BlockBackend, which is completely independent of bs.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c                       | 35 ++++++++++++++++++++++++-----------
 block/bochs.c                 |  6 ++++++
 block/cloop.c                 |  6 ++++++
 block/crypto.c                |  6 ++++++
 block/dmg.c                   |  6 ++++++
 block/parallels.c             |  6 ++++++
 block/qcow.c                  |  6 ++++++
 block/qcow2.c                 | 18 +++++++++++++++---
 block/qed.c                   | 18 +++++++++++++++---
 block/raw-format.c            |  6 ++++++
 block/replication.c           |  6 ++++++
 block/vdi.c                   |  6 ++++++
 block/vhdx.c                  |  6 ++++++
 block/vmdk.c                  |  6 ++++++
 block/vpc.c                   |  6 ++++++
 tests/qemu-iotests/051.out    |  4 ++--
 tests/qemu-iotests/051.pc.out |  4 ++--
 17 files changed, 130 insertions(+), 21 deletions(-)

diff --git a/block.c b/block.c
index d951b5d..40c4dee 100644
--- a/block.c
+++ b/block.c
@@ -1103,13 +1103,6 @@ static int bdrv_open_common(BlockDriverState *bs, BdrvChild *file,
         assert(!drv->bdrv_needs_filename || filename != NULL);
         ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
     } else {
-        if (file == NULL) {
-            error_setg(errp, "Can't use '%s' as a block driver for the "
-                       "protocol level", drv->format_name);
-            ret = -EINVAL;
-            goto free_and_fail;
-        }
-        bs->file = file;
         ret = drv->bdrv_open(bs, options, open_flags, &local_err);
     }
 
@@ -1145,7 +1138,6 @@ static int bdrv_open_common(BlockDriverState *bs, BdrvChild *file,
     return 0;
 
 free_and_fail:
-    bs->file = NULL;
     g_free(bs->opaque);
     bs->opaque = NULL;
     bs->drv = NULL;
@@ -1368,7 +1360,18 @@ void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child)
     }
 
     if (child->bs->inherits_from == parent) {
-        child->bs->inherits_from = NULL;
+        BdrvChild *c;
+
+        /* Remove inherits_from only when the last reference between parent and
+         * child->bs goes away. */
+        QLIST_FOREACH(c, &parent->children, next) {
+            if (c != child && c->bs == child->bs) {
+                break;
+            }
+        }
+        if (c == NULL) {
+            child->bs->inherits_from = NULL;
+        }
     }
 
     bdrv_root_unref_child(child);
@@ -1789,13 +1792,20 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
         qdict_del(options, "backing");
     }
 
-    /* Open image file without format layer */
+    /* Open image file without format layer. This BdrvChild is only used for
+     * probing, the block drivers will do their own bdrv_open_child() for the
+     * same BDS, which is why we put the node name back into options. */
     if ((flags & BDRV_O_PROTOCOL) == 0) {
+        /* FIXME Shouldn't attach a child to a node that isn't opened yet. */
         file = bdrv_open_child(filename, options, "file", bs,
                                &child_file, true, &local_err);
         if (local_err) {
             goto fail;
         }
+        if (file != NULL) {
+            qdict_put(options, "file",
+                      qstring_from_str(bdrv_get_node_name(file->bs)));
+        }
     }
 
     /* Image format probing */
@@ -1835,7 +1845,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
         goto fail;
     }
 
-    if (file && (bs->file != file)) {
+    if (file) {
         bdrv_unref_child(bs, file);
         file = NULL;
     }
@@ -1901,6 +1911,9 @@ fail:
     if (file != NULL) {
         bdrv_unref_child(bs, file);
     }
+    if (bs->file != NULL) {
+        bdrv_unref_child(bs, bs->file);
+    }
     QDECREF(snapshot_options);
     QDECREF(bs->explicit_options);
     QDECREF(bs->options);
diff --git a/block/bochs.c b/block/bochs.c
index 8c9652e..7dd2ac4 100644
--- a/block/bochs.c
+++ b/block/bochs.c
@@ -104,6 +104,12 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
     struct bochs_header bochs;
     int ret;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     bs->read_only = true; /* no write support yet */
 
     ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
diff --git a/block/cloop.c b/block/cloop.c
index 7b75f7e..877c9b0 100644
--- a/block/cloop.c
+++ b/block/cloop.c
@@ -66,6 +66,12 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
     uint32_t offsets_size, max_compressed_block_size = 1, i;
     int ret;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     bs->read_only = true;
 
     /* read header */
diff --git a/block/crypto.c b/block/crypto.c
index e05e4dd..7cb2ff2 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -300,6 +300,12 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
     QCryptoBlockOpenOptions *open_opts = NULL;
     unsigned int cflags = 0;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     opts = qemu_opts_create(opts_spec, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (local_err) {
diff --git a/block/dmg.c b/block/dmg.c
index 58a3ae8..8e387cd 100644
--- a/block/dmg.c
+++ b/block/dmg.c
@@ -413,6 +413,12 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
     int64_t offset;
     int ret;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     block_module_load_one("dmg-bz2");
     bs->read_only = true;
 
diff --git a/block/parallels.c b/block/parallels.c
index ac94dfb..b2ec09f 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -581,6 +581,12 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
     Error *local_err = NULL;
     char *buf;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     ret = bdrv_pread(bs->file, 0, &ph, sizeof(ph));
     if (ret < 0) {
         goto fail;
diff --git a/block/qcow.c b/block/qcow.c
index 4534515..038b05a 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -106,6 +106,12 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
     QCowHeader header;
     Error *local_err = NULL;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
     if (ret < 0) {
         goto fail;
diff --git a/block/qcow2.c b/block/qcow2.c
index 3e1172b..21e6142 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -814,8 +814,8 @@ static int qcow2_update_options(BlockDriverState *bs, QDict *options,
     return ret;
 }
 
-static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
+                         Error **errp)
 {
     BDRVQcow2State *s = bs->opaque;
     unsigned int len, i;
@@ -1205,6 +1205,18 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
     return ret;
 }
 
+static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
+                      Error **errp)
+{
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
+    return qcow2_do_open(bs, options, flags, errp);
+}
+
 static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp)
 {
     BDRVQcow2State *s = bs->opaque;
@@ -1785,7 +1797,7 @@ static void qcow2_invalidate_cache(BlockDriverState *bs, Error **errp)
     options = qdict_clone_shallow(bs->options);
 
     flags &= ~BDRV_O_INACTIVE;
-    ret = qcow2_open(bs, options, flags, &local_err);
+    ret = qcow2_do_open(bs, options, flags, &local_err);
     QDECREF(options);
     if (local_err) {
         error_propagate(errp, local_err);
diff --git a/block/qed.c b/block/qed.c
index 0b62c77..62a0a09 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -415,8 +415,8 @@ static void bdrv_qed_drain(BlockDriverState *bs)
     }
 }
 
-static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
-                         Error **errp)
+static int bdrv_qed_do_open(BlockDriverState *bs, QDict *options, int flags,
+                            Error **errp)
 {
     BDRVQEDState *s = bs->opaque;
     QEDHeader le_header;
@@ -550,6 +550,18 @@ out:
     return ret;
 }
 
+static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
+                         Error **errp)
+{
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
+    return bdrv_qed_do_open(bs, options, flags, errp);
+}
+
 static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp)
 {
     BDRVQEDState *s = bs->opaque;
@@ -1629,7 +1641,7 @@ static void bdrv_qed_invalidate_cache(BlockDriverState *bs, Error **errp)
     bdrv_qed_close(bs);
 
     memset(s, 0, sizeof(BDRVQEDState));
-    ret = bdrv_qed_open(bs, NULL, bs->open_flags, &local_err);
+    ret = bdrv_qed_do_open(bs, NULL, bs->open_flags, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         error_prepend(errp, "Could not reopen qed layer: ");
diff --git a/block/raw-format.c b/block/raw-format.c
index 0ddffbd..ce34d1b 100644
--- a/block/raw-format.c
+++ b/block/raw-format.c
@@ -384,6 +384,12 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVRawState *s = bs->opaque;
     int ret;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     bs->sg = bs->file->bs->sg;
     bs->supported_write_flags = BDRV_REQ_FUA &
         bs->file->bs->supported_write_flags;
diff --git a/block/replication.c b/block/replication.c
index 729dd12..eff85c7 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -86,6 +86,12 @@ static int replication_open(BlockDriverState *bs, QDict *options,
     const char *mode;
     const char *top_id;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     ret = -EINVAL;
     opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
diff --git a/block/vdi.c b/block/vdi.c
index 0aeb940..18b4773 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -363,6 +363,12 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
     int ret;
     Error *local_err = NULL;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     logout("\n");
 
     ret = bdrv_read(bs->file, 0, (uint8_t *)&header, 1);
diff --git a/block/vhdx.c b/block/vhdx.c
index c67772e..9918ee9 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -898,6 +898,12 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
     uint64_t signature;
     Error *local_err = NULL;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     s->bat = NULL;
     s->first_visible_write = true;
 
diff --git a/block/vmdk.c b/block/vmdk.c
index 393c84d..9d68ec5 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -943,6 +943,12 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
     uint32_t magic;
     Error *local_err = NULL;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     buf = vmdk_read_desc(bs->file, 0, errp);
     if (!buf) {
         return -EINVAL;
diff --git a/block/vpc.c b/block/vpc.c
index ed6353d..d0df2a1 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -220,6 +220,12 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
     int disk_type = VHD_DYNAMIC;
     int ret;
 
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
+                               false, errp);
+    if (!bs->file) {
+        return -EINVAL;
+    }
+
     opts = qemu_opts_create(&vpc_runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (local_err) {
diff --git a/tests/qemu-iotests/051.out b/tests/qemu-iotests/051.out
index 42bf416..7524c62 100644
--- a/tests/qemu-iotests/051.out
+++ b/tests/qemu-iotests/051.out
@@ -225,7 +225,7 @@ Testing: -drive driver=nbd
 QEMU_PROG: -drive driver=nbd: NBD server address missing
 
 Testing: -drive driver=raw
-QEMU_PROG: -drive driver=raw: Can't use 'raw' as a block driver for the protocol level
+QEMU_PROG: -drive driver=raw: A block device must be specified for "file"
 
 Testing: -drive file.driver=file
 QEMU_PROG: -drive file.driver=file: The 'file' block driver requires a file name
@@ -234,7 +234,7 @@ Testing: -drive file.driver=nbd
 QEMU_PROG: -drive file.driver=nbd: NBD server address missing
 
 Testing: -drive file.driver=raw
-QEMU_PROG: -drive file.driver=raw: Can't use 'raw' as a block driver for the protocol level
+QEMU_PROG: -drive file.driver=raw: A block device must be specified for "file"
 
 Testing: -drive foo=bar
 QEMU_PROG: -drive foo=bar: Must specify either driver or file
diff --git a/tests/qemu-iotests/051.pc.out b/tests/qemu-iotests/051.pc.out
index 603bb76..f1669c1 100644
--- a/tests/qemu-iotests/051.pc.out
+++ b/tests/qemu-iotests/051.pc.out
@@ -319,7 +319,7 @@ Testing: -drive driver=nbd
 QEMU_PROG: -drive driver=nbd: NBD server address missing
 
 Testing: -drive driver=raw
-QEMU_PROG: -drive driver=raw: Can't use 'raw' as a block driver for the protocol level
+QEMU_PROG: -drive driver=raw: A block device must be specified for "file"
 
 Testing: -drive file.driver=file
 QEMU_PROG: -drive file.driver=file: The 'file' block driver requires a file name
@@ -328,7 +328,7 @@ Testing: -drive file.driver=nbd
 QEMU_PROG: -drive file.driver=nbd: NBD server address missing
 
 Testing: -drive file.driver=raw
-QEMU_PROG: -drive file.driver=raw: Can't use 'raw' as a block driver for the protocol level
+QEMU_PROG: -drive file.driver=raw: A block device must be specified for "file"
 
 Testing: -drive foo=bar
 QEMU_PROG: -drive foo=bar: Must specify either driver or file
-- 
1.8.3.1

  parent reply	other threads:[~2017-02-21 14:59 UTC|newest]

Thread overview: 131+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-21 14:57 [Qemu-devel] [PATCH 00/54] New op blocker system, part 1 Kevin Wolf
2017-02-21 14:57 ` [Qemu-devel] [PATCH 01/54] blockdev: Use BlockBackend to resize in qmp_block_resize() Kevin Wolf
2017-02-22 12:27   ` Max Reitz
2017-02-21 14:57 ` [Qemu-devel] [PATCH 02/54] qcow2: Use BB for resizing in qcow2_amend_options() Kevin Wolf
2017-02-22 12:28   ` Max Reitz
2017-02-22 15:53   ` Eric Blake
2017-02-21 14:57 ` [Qemu-devel] [PATCH 03/54] mirror: Resize active commit base in mirror_run() Kevin Wolf
2017-02-22 12:34   ` Max Reitz
2017-02-23 11:31   ` Fam Zheng
2017-02-21 14:58 ` [Qemu-devel] [PATCH 04/54] block: Pass BdrvChild to bdrv_truncate() Kevin Wolf
2017-02-22 12:37   ` Max Reitz
2017-02-21 14:58 ` Kevin Wolf [this message]
2017-02-22 12:41   ` [Qemu-devel] [PATCH 05/54] block: Attach bs->file only during .bdrv_open() Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 06/54] block: Factor out bdrv_open_child_bs() Kevin Wolf
2017-02-22 12:46   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 07/54] block: Use BlockBackend for image probing Kevin Wolf
2017-02-22 12:56   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 08/54] block: Factor out bdrv_open_driver() Kevin Wolf
2017-02-22 12:59   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 09/54] block: Add bdrv_new_open_driver() Kevin Wolf
2017-02-22 13:15   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 10/54] vvfat: Use opened node as backing file Kevin Wolf
2017-02-22 13:26   ` Max Reitz
2017-02-23 11:49   ` Fam Zheng
2017-02-23 12:25     ` Kevin Wolf
2017-02-23 12:45       ` Fam Zheng
2017-02-21 14:58 ` [Qemu-devel] [PATCH 11/54] tests: Use opened block node for block job tests Kevin Wolf
2017-02-22 13:41   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 12/54] block: Add op blocker permission constants Kevin Wolf
2017-02-22 13:43   ` Max Reitz
2017-02-23 11:53   ` Fam Zheng
2017-02-21 14:58 ` [Qemu-devel] [PATCH 13/54] block: Add Error argument to bdrv_attach_child() Kevin Wolf
2017-02-22 13:46   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 14/54] block: Let callers request permissions when attaching a child node Kevin Wolf
2017-02-22 13:47   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 15/54] block: Involve block drivers in permission granting Kevin Wolf
2017-02-22 14:04   ` Max Reitz
2017-02-27 12:28     ` Kevin Wolf
2017-02-27 12:32       ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 16/54] block: Default .bdrv_child_perm() for filter drivers Kevin Wolf
2017-02-22 14:05   ` Max Reitz
2017-02-22 14:28   ` Max Reitz
2017-02-23 12:36   ` Fam Zheng
2017-02-21 14:58 ` [Qemu-devel] [PATCH 17/54] block: Request child permissions in " Kevin Wolf
2017-02-22 14:07   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 18/54] block: Default .bdrv_child_perm() for format drivers Kevin Wolf
2017-02-22 14:08   ` Max Reitz
2017-02-25 11:57   ` Max Reitz
2017-02-27 12:33     ` Kevin Wolf
2017-02-27 12:34       ` Max Reitz
2017-02-27 14:05         ` Kevin Wolf
2017-02-27 14:15           ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 19/54] block: Request child permissions in " Kevin Wolf
2017-02-22 14:09   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 20/54] vvfat: Implement .bdrv_child_perm() Kevin Wolf
2017-02-22 14:12   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 21/54] block: Require .bdrv_child_perm() with child nodes Kevin Wolf
2017-02-22 14:14   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 22/54] block: Request real permissions in bdrv_attach_child() Kevin Wolf
2017-02-22 14:24   ` Max Reitz
2017-02-22 14:31   ` Max Reitz
2017-02-27 14:10     ` Kevin Wolf
2017-02-21 14:58 ` [Qemu-devel] [PATCH 23/54] block: Add permissions to BlockBackend Kevin Wolf
2017-02-22 14:32   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 24/54] block: Add permissions to blk_new() Kevin Wolf
2017-02-22 14:36   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 25/54] block: Add error parameter to blk_insert_bs() Kevin Wolf
2017-02-22 14:42   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 26/54] block: Add BDRV_O_RESIZE for blk_new_open() Kevin Wolf
2017-02-22 14:51   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 27/54] block: Request real permissions in blk_new_open() Kevin Wolf
2017-02-22 14:52   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 28/54] block: Allow error return in BlockDevOps.change_media_cb() Kevin Wolf
2017-02-24 13:29   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 29/54] hw/block: Request permissions Kevin Wolf
2017-02-24 13:46   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 30/54] hw/block: Introduce share-rw qdev property Kevin Wolf
2017-02-24 13:49   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 31/54] blockjob: Add permissions to block_job_create() Kevin Wolf
2017-02-24 13:50   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 32/54] block: Add BdrvChildRole.get_parent_desc() Kevin Wolf
2017-02-24 13:56   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 33/54] block: Include details on permission errors in message Kevin Wolf
2017-02-24  8:41   ` Fam Zheng
2017-02-24 13:58   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 34/54] block: Add BdrvChildRole.stay_at_node Kevin Wolf
2017-02-24 14:00   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 35/54] blockjob: Add permissions to block_job_add_bdrv() Kevin Wolf
2017-02-24 14:10   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 36/54] commit: Use real permissions in commit block job Kevin Wolf
2017-02-24 17:29   ` Max Reitz
2017-02-27 18:43     ` Kevin Wolf
2017-02-21 14:58 ` [Qemu-devel] [PATCH 37/54] commit: Use real permissions for HMP 'commit' Kevin Wolf
2017-02-25 11:58   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 38/54] backup: Use real permissions in backup block job Kevin Wolf
2017-02-25 12:06   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 39/54] block: Fix pending requests check in bdrv_append() Kevin Wolf
2017-02-25 12:15   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 40/54] block: BdrvChildRole.attach/detach() callbacks Kevin Wolf
2017-02-25 12:29   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 41/54] block: Allow backing file links in change_parent_backing_link() Kevin Wolf
2017-02-25 12:33   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 42/54] mirror: Use real permissions in mirror/active commit block job Kevin Wolf
2017-02-25 13:49   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 43/54] stream: Use real permissions in streaming " Kevin Wolf
2017-02-25 13:58   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 44/54] mirror: Add filter-node-name to blockdev-mirror Kevin Wolf
2017-02-25 14:19   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 45/54] commit: Add filter-node-name to block-commit Kevin Wolf
2017-02-25 14:37   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 46/54] hmp: Request permissions in qemu-io Kevin Wolf
2017-02-25 14:46   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 47/54] migration/block: Use real permissions Kevin Wolf
2017-02-25 14:54   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 48/54] nbd/server: Use real permissions for NBD exports Kevin Wolf
2017-02-25 15:05   ` Max Reitz
2017-02-27 20:09   ` Eric Blake
2017-02-21 14:58 ` [Qemu-devel] [PATCH 49/54] tests: Remove FIXME comments Kevin Wolf
2017-02-25 15:06   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 50/54] block: Pass BdrvChild to bdrv_aligned_preadv/pwritev Kevin Wolf
2017-02-25 15:12   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 51/54] block: Assertions for write permissions Kevin Wolf
2017-02-25 15:13   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 52/54] block: Assertions for resize permission Kevin Wolf
2017-02-25 15:14   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 53/54] block: Add Error parameter to bdrv_set_backing_hd() Kevin Wolf
2017-02-25 15:36   ` Max Reitz
2017-02-21 14:58 ` [Qemu-devel] [PATCH 54/54] block: Add Error parameter to bdrv_append() Kevin Wolf
2017-02-25 15:49   ` Max Reitz
2017-02-21 16:38 ` [Qemu-devel] [PATCH 00/54] New op blocker system, part 1 no-reply
2017-02-24 14: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=1487689130-30373-6-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=famz@redhat.com \
    --cc=jcody@redhat.com \
    --cc=mreitz@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.