qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: [PATCH v2 24/33] block: Make format drivers use child_of_bds
Date: Tue,  4 Feb 2020 18:08:39 +0100	[thread overview]
Message-ID: <20200204170848.614480-25-mreitz@redhat.com> (raw)
In-Reply-To: <20200204170848.614480-1-mreitz@redhat.com>

Commonly, they need to pass the BDRV_CHILD_IMAGE set as the
BdrvChildRole; but there are exceptions for drivers with external data
files (qcow2 and vmdk).

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 block/bochs.c     |  4 ++--
 block/cloop.c     |  4 ++--
 block/crypto.c    |  4 ++--
 block/dmg.c       |  4 ++--
 block/parallels.c |  4 ++--
 block/qcow.c      |  4 ++--
 block/qcow2.c     | 19 +++++++++++++------
 block/qed.c       |  4 ++--
 block/vdi.c       |  4 ++--
 block/vhdx.c      |  4 ++--
 block/vmdk.c      | 20 +++++++++++++++++---
 block/vpc.c       |  4 ++--
 12 files changed, 50 insertions(+), 29 deletions(-)

diff --git a/block/bochs.c b/block/bochs.c
index b013e73063..62c3f42548 100644
--- a/block/bochs.c
+++ b/block/bochs.c
@@ -110,8 +110,8 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
         return ret;
     }
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/cloop.c b/block/cloop.c
index 3ed9fa63cc..d374a8427d 100644
--- a/block/cloop.c
+++ b/block/cloop.c
@@ -71,8 +71,8 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
         return ret;
     }
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/crypto.c b/block/crypto.c
index 4da74a7737..2d85d9e70a 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -200,8 +200,8 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
     unsigned int cflags = 0;
     QDict *cryptoopts = NULL;
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/dmg.c b/block/dmg.c
index af8188638c..bc64194577 100644
--- a/block/dmg.c
+++ b/block/dmg.c
@@ -439,8 +439,8 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
         return ret;
     }
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/parallels.c b/block/parallels.c
index 3d5b3b7c63..7dc9a1fa76 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -728,8 +728,8 @@ 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, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/qcow.c b/block/qcow.c
index 2bf8e8eb36..bc7f7c1054 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -130,8 +130,8 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
     qdict_extract_subqdict(options, &encryptopts, "encrypt.");
     encryptfmt = qdict_get_try_str(encryptopts, "format");
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         ret = -EINVAL;
         goto fail;
diff --git a/block/qcow2.c b/block/qcow2.c
index 94e394d608..84d913eed1 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1534,8 +1534,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
     }
 
     /* Open external data file */
-    s->data_file = bdrv_open_child(NULL, options, "data-file", bs, &child_file,
-                                   0, true, &local_err);
+    s->data_file = bdrv_open_child(NULL, options, "data-file", bs,
+                                   &child_of_bds, BDRV_CHILD_DATA,
+                                   true, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
@@ -1545,8 +1546,8 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
     if (s->incompatible_features & QCOW2_INCOMPAT_DATA_FILE) {
         if (!s->data_file && s->image_data_file) {
             s->data_file = bdrv_open_child(s->image_data_file, options,
-                                           "data-file", bs, &child_file, 0,
-                                           false, errp);
+                                           "data-file", bs, &child_of_bds,
+                                           BDRV_CHILD_DATA, false, errp);
             if (!s->data_file) {
                 ret = -EINVAL;
                 goto fail;
@@ -1557,6 +1558,12 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
             ret = -EINVAL;
             goto fail;
         }
+
+        /* No data here */
+        bs->file->role &= ~BDRV_CHILD_DATA;
+
+        /* Must succeed because we have given up permissions if anything */
+        bdrv_child_refresh_perms(bs, bs->file, &error_abort);
     } else {
         if (s->data_file) {
             error_setg(errp, "'data-file' can only be set for images with an "
@@ -1805,8 +1812,8 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
         .ret = -EINPROGRESS
     };
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/qed.c b/block/qed.c
index d15ba11959..d6222798c2 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -547,8 +547,8 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
         .ret = -EINPROGRESS
     };
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/vdi.c b/block/vdi.c
index 987e2ed592..1736d02eee 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -378,8 +378,8 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
     Error *local_err = NULL;
     QemuUUID uuid_link, uuid_parent;
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/vhdx.c b/block/vhdx.c
index be23290ac8..d8a315015d 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -997,8 +997,8 @@ 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, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
diff --git a/block/vmdk.c b/block/vmdk.c
index 84f99d881f..497414e5f2 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1089,6 +1089,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
     char *desc_file_dir = NULL;
     char *extent_path;
     BdrvChild *extent_file;
+    BdrvChildRole extent_role;
     BDRVVmdkState *s = bs->opaque;
     VmdkExtent *extent;
     char extent_opt_prefix[32];
@@ -1151,8 +1152,15 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
         ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
         assert(ret < 32);
 
+        extent_role = BDRV_CHILD_DATA;
+        if (strcmp(type, "FLAT") != 0 && strcmp(type, "VMFS") != 0) {
+            /* non-flat extents have metadata */
+            extent_role |= BDRV_CHILD_METADATA;
+        }
+
         extent_file = bdrv_open_child(extent_path, options, extent_opt_prefix,
-                                      bs, &child_file, 0, false, &local_err);
+                                      bs, &child_of_bds, extent_role, false,
+                                      &local_err);
         g_free(extent_path);
         if (local_err) {
             error_propagate(errp, local_err);
@@ -1257,8 +1265,8 @@ 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, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
@@ -1277,6 +1285,12 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
             s->desc_offset = 0x200;
             break;
         default:
+            /* No data in the descriptor file */
+            bs->file->role &= ~BDRV_CHILD_DATA;
+
+            /* Must succeed because we have given up permissions if anything */
+            bdrv_child_refresh_perms(bs, bs->file, &error_abort);
+
             ret = vmdk_open_desc_file(bs, flags, buf, options, errp);
             break;
     }
diff --git a/block/vpc.c b/block/vpc.c
index 5378e32d1d..9acd6edac9 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -228,8 +228,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
     int ret;
     int64_t bs_size;
 
-    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
-                               false, errp);
+    bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+                               BDRV_CHILD_IMAGE, false, errp);
     if (!bs->file) {
         return -EINVAL;
     }
-- 
2.24.1



  parent reply	other threads:[~2020-02-04 17:22 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-04 17:08 [PATCH v2 00/33] block: Introduce real BdrvChildRole Max Reitz
2020-02-04 17:08 ` [PATCH v2 01/33] block: Add BlockDriver.is_format Max Reitz
2020-02-05 13:51   ` Eric Blake
2020-02-06 10:25     ` Max Reitz
2020-02-11 15:30   ` Alberto Garcia
2020-02-04 17:08 ` [PATCH v2 02/33] block: Rename BdrvChildRole to BdrvChildClass Max Reitz
2020-02-05 15:20   ` Eric Blake
2020-02-11 15:31   ` Alberto Garcia
2020-02-04 17:08 ` [PATCH v2 03/33] block: Add BdrvChildRole Max Reitz
2020-02-05 15:24   ` Eric Blake
2020-02-06 10:47     ` Max Reitz
2020-02-06 10:49       ` Max Reitz
2020-02-11 15:35         ` Eric Blake
2020-02-11 15:41   ` Alberto Garcia
2020-02-17 14:40     ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 04/33] block: Add BdrvChildRole to BdrvChild Max Reitz
2020-02-05 15:33   ` Eric Blake
2020-02-06 10:53     ` Max Reitz
2020-02-11 15:37       ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 05/33] block: Pass BdrvChildRole to bdrv_child_perm() Max Reitz
2020-02-05 16:14   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 06/33] block: Pass BdrvChildRole to .inherit_options() Max Reitz
2020-02-05 16:18   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 07/33] block: Pass parent_is_format " Max Reitz
2020-02-05 16:26   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 08/33] block: Rename bdrv_inherited_options() Max Reitz
2020-02-05 16:36   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 09/33] block: Add generic bdrv_inherited_options() Max Reitz
2020-02-05 16:48   ` Eric Blake
2020-02-06 11:06     ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 10/33] block: Use bdrv_inherited_options() Max Reitz
2020-02-05 17:14   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 11/33] block: Unify bdrv_child_cb_attach() Max Reitz
2020-02-05 17:24   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 12/33] block: Unify bdrv_child_cb_detach() Max Reitz
2020-02-05 17:26   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 13/33] block: Add child_of_bds Max Reitz
2020-02-05 20:33   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 14/33] block: Distinguish paths in *_format_default_perms Max Reitz
2020-02-05 20:54   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 15/33] block: Pull out bdrv_default_perms_for_backing() Max Reitz
2020-02-05 20:56   ` Eric Blake
2020-02-06 11:19     ` Max Reitz
2020-02-11 15:38       ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 16/33] block: Pull out bdrv_default_perms_for_storage() Max Reitz
2020-02-05 21:02   ` Eric Blake
2020-02-06 11:20     ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 17/33] block: Split bdrv_default_perms_for_storage() Max Reitz
2020-02-05 21:25   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 18/33] block: Add bdrv_default_perms() Max Reitz
2020-02-05 21:53   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 19/33] raw-format: Split raw_read_options() Max Reitz
2020-02-05 21:57   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 20/33] block: Switch child_format users to child_of_bds Max Reitz
2020-02-05 22:11   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 21/33] block: Drop child_format Max Reitz
2020-02-05 22:19   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 22/33] block: Make backing files child_of_bds children Max Reitz
2020-02-05 22:45   ` Eric Blake
2020-02-06 11:33     ` Max Reitz
2020-02-11 15:39       ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 23/33] block: Drop child_backing Max Reitz
2020-02-05 22:48   ` Eric Blake
2020-02-04 17:08 ` Max Reitz [this message]
2020-02-05 22:54   ` [PATCH v2 24/33] block: Make format drivers use child_of_bds Eric Blake
2020-02-04 17:08 ` [PATCH v2 25/33] block: Make filter " Max Reitz
2020-02-05 23:02   ` Eric Blake
2020-02-06 11:35     ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 26/33] block: Use child_of_bds in remaining places Max Reitz
2020-02-05 23:28   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 27/33] tests: Use child_of_bds instead of child_file Max Reitz
2020-02-11 15:42   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 28/33] block: Use bdrv_default_perms() Max Reitz
2020-02-11 15:46   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 29/33] block: Make bdrv_filter_default_perms() static Max Reitz
2020-02-11 15:48   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 30/33] block: Drop bdrv_format_default_perms() Max Reitz
2020-02-11 15:48   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 31/33] block: Drop child_file Max Reitz
2020-02-11 15:49   ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 32/33] block: Pass BdrvChildRole in remaining cases Max Reitz
2020-02-11 15:53   ` Eric Blake
2020-02-18 12:01     ` Max Reitz
2020-02-18 12:53       ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 33/33] block: Drop @child_class from bdrv_child_perm() Max Reitz
2020-02-11 15:56   ` Eric Blake

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=20200204170848.614480-25-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.com \
    /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).