All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>, Alberto Garcia <berto@igalia.com>,
	Eric Blake <eblake@redhat.com>, John Snow <jsnow@redhat.com>
Subject: [Qemu-devel] [PATCH v7 for-2.12 03/25] block: Add BDS.backing_overridden
Date: Mon, 20 Nov 2017 21:09:42 +0100	[thread overview]
Message-ID: <20171120201004.14999-4-mreitz@redhat.com> (raw)
In-Reply-To: <20171120201004.14999-1-mreitz@redhat.com>

If the backing file is overridden, this most probably does change the
guest-visible data of a BDS. Therefore, we will need to consider this in
bdrv_refresh_filename().

Adding a new field to the BDS is not nice, but it is very simple and
exactly keeps track of whether the backing file has been overridden.

This commit adds a FIXME which will be remedied by a follow-up commit.
Until then, the respective piece of code will not result in any behavior
that is worse than what we currently have.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 include/block/block_int.h |  1 +
 block.c                   | 13 +++++++++++++
 block/mirror.c            |  4 ++++
 blockdev.c                | 16 ++++++++++++++++
 4 files changed, 34 insertions(+)

diff --git a/include/block/block_int.h b/include/block/block_int.h
index a5482775ec..5e9734d8b5 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -619,6 +619,7 @@ struct BlockDriverState {
     char backing_file[PATH_MAX]; /* if non zero, the image is a diff of
                                     this file image */
     char backing_format[16]; /* if non-zero and backing_file exists */
+    bool backing_overridden; /* backing file has been specified by the user */
 
     QDict *full_open_options;
     char exact_filename[PATH_MAX];
diff --git a/block.c b/block.c
index 4aebf590d8..eb67dfbcc0 100644
--- a/block.c
+++ b/block.c
@@ -2233,6 +2233,11 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
     reference = qdict_get_try_str(parent_options, bdref_key);
     if (reference || qdict_haskey(options, "file.filename")) {
         backing_filename[0] = '\0';
+
+        /* FIXME: Should also be set to true if @options contains other runtime
+         *        options which control the data that is read from the backing
+         *        BDS */
+        bs->backing_overridden = true;
     } else if (bs->backing_file[0] == '\0' && qdict_size(options) == 0) {
         QDECREF(options);
         goto free_exit;
@@ -2434,6 +2439,9 @@ static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
         goto out;
     }
 
+    bs_snapshot->backing_overridden = true;
+    bdrv_refresh_filename(bs_snapshot);
+
 out:
     QDECREF(snapshot_options);
     g_free(tmp_filename);
@@ -2564,6 +2572,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
     backing = qdict_get_try_str(options, "backing");
     if (backing && *backing == '\0') {
         flags |= BDRV_O_NO_BACKING;
+        bs->backing_overridden = true;
         qdict_del(options, "backing");
     }
 
@@ -4976,6 +4985,10 @@ void bdrv_refresh_filename(BlockDriverState *bs)
      * refresh those first */
     QLIST_FOREACH(child, &bs->children, next) {
         bdrv_refresh_filename(child->bs);
+
+        if (child->role == &child_backing && child->bs->backing_overridden) {
+            bs->backing_overridden = true;
+        }
     }
 
     if (drv->bdrv_refresh_filename) {
diff --git a/block/mirror.c b/block/mirror.c
index f059981f19..d6e487fb2e 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -530,6 +530,10 @@ static void mirror_exit(BlockJob *job, void *opaque)
             error_report_err(local_err);
             data->ret = -EPERM;
         }
+
+        /* The target image's file already has been created with the backing
+         * file we just set, so there is no need to set backing_overridden or
+         * call bdrv_refresh_filename(). */
     }
 
     if (s->to_replace) {
diff --git a/blockdev.c b/blockdev.c
index 56a6b24a0b..b0393e1786 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1781,6 +1781,8 @@ static void external_snapshot_commit(BlkActionState *common)
 {
     ExternalSnapshotState *state =
                              DO_UPCAST(ExternalSnapshotState, common, common);
+    TransactionAction *action = common->action;
+    bool image_was_existing = false;
 
     /* We don't need (or want) to use the transactional
      * bdrv_reopen_multiple() across all the entries at once, because we
@@ -1789,6 +1791,20 @@ static void external_snapshot_commit(BlkActionState *common)
         bdrv_reopen(state->old_bs, state->old_bs->open_flags & ~BDRV_O_RDWR,
                     NULL);
     }
+
+    if (action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC) {
+        BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data;
+        if (s->has_mode && s->mode == NEW_IMAGE_MODE_EXISTING) {
+            image_was_existing = true;
+        }
+    } else {
+        image_was_existing = true;
+    }
+
+    if (image_was_existing) {
+        state->new_bs->backing_overridden = true;
+        bdrv_refresh_filename(state->new_bs);
+    }
 }
 
 static void external_snapshot_abort(BlkActionState *common)
-- 
2.13.6

  parent reply	other threads:[~2017-11-20 20:10 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-20 20:09 [Qemu-devel] [PATCH v7 for-2.12 00/25] block: Fix some filename generation issues Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 01/25] block/mirror: Small absolute-paths simplification Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 02/25] block: Use children list in bdrv_refresh_filename Max Reitz
2017-11-20 20:09 ` Max Reitz [this message]
2017-12-01 15:18   ` [Qemu-devel] [PATCH v7 for-2.12 03/25] block: Add BDS.backing_overridden Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 04/25] iotests: Drop explicit base blockdev in 191 Max Reitz
2017-12-01 15:33   ` Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 05/25] block: Respect backing bs in bdrv_refresh_filename Max Reitz
2017-12-05 13:27   ` Alberto Garcia
2017-12-08 13:59     ` Max Reitz
2017-12-11 15:00   ` Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 06/25] block: Make path_combine() return the path Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 07/25] block: bdrv_get_full_backing_filename_from_...'s ret. val Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 08/25] block: bdrv_get_full_backing_filename's " Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 09/25] block: Add bdrv_make_absolute_filename() Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 10/25] block: Fix bdrv_find_backing_image() Max Reitz
2017-12-04 14:52   ` Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 11/25] block: Add bdrv_dirname() Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 12/25] blkverify: Make bdrv_dirname() return NULL Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 13/25] quorum: " Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 14/25] block/nbd: " Max Reitz
2017-12-04 15:01   ` Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 15/25] block/nfs: Implement bdrv_dirname() Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 16/25] block: Use bdrv_dirname() for relative filenames Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 17/25] iotests: Add quorum case to test 110 Max Reitz
2017-12-04 15:09   ` Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 18/25] block: Add sgfnt_runtime_opts to BlockDriver Max Reitz
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 19/25] block: Add BlockDriver.bdrv_gather_child_options Max Reitz
2017-12-05 13:13   ` Alberto Garcia
2017-11-20 20:09 ` [Qemu-devel] [PATCH v7 for-2.12 20/25] block: Generically refresh runtime options Max Reitz
2017-12-04 16:16   ` Alberto Garcia
2017-11-20 20:10 ` [Qemu-devel] [PATCH v7 for-2.12 21/25] block: Purify .bdrv_refresh_filename() Max Reitz
2017-12-04 16:37   ` Alberto Garcia
2017-12-04 18:25     ` Max Reitz
2018-02-02 17:41       ` Max Reitz
2017-11-20 20:10 ` [Qemu-devel] [PATCH v7 for-2.12 22/25] block: Do not copy exact_filename from format file Max Reitz
2017-12-04 16:40   ` Alberto Garcia
2017-11-20 20:10 ` [Qemu-devel] [PATCH v7 for-2.12 23/25] block: Fix FIXME from "Add BDS.backing_overridden" Max Reitz
2017-12-05 13:09   ` Alberto Garcia
2017-11-20 20:10 ` [Qemu-devel] [PATCH v7 for-2.12 24/25] block/curl: Implement bdrv_refresh_filename() Max Reitz
2017-12-04 16:51   ` Alberto Garcia
2017-12-04 18:26     ` Max Reitz
2017-12-05 10:31       ` Alberto Garcia
2017-12-08 13:47         ` Max Reitz
2017-12-08 13:53           ` Daniel P. Berrange
2017-12-08 14:12             ` Max Reitz
2017-12-08 16:14           ` Alberto Garcia
2017-12-05 11:45   ` Alberto Garcia
2017-11-20 20:10 ` [Qemu-devel] [PATCH v7 for-2.12 25/25] block/null: Generate filename even with latency-ns Max Reitz
2017-12-04 16:46   ` Alberto Garcia

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=20171120201004.14999-4-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=berto@igalia.com \
    --cc=eblake@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=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 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.