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>
Subject: [Qemu-devel] [PATCH v5 03/25] block: Add BDS.backing_overridden
Date: Wed, 21 Jun 2017 14:50:25 +0200	[thread overview]
Message-ID: <20170621125047.30294-4-mreitz@redhat.com> (raw)
In-Reply-To: <20170621125047.30294-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 6820027..bedf19b 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -547,6 +547,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 2926f53..2addec0 100644
--- a/block.c
+++ b/block.c
@@ -2147,6 +2147,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;
@@ -2346,6 +2351,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);
@@ -2476,6 +2484,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");
     }
 
@@ -4799,6 +4808,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 df6c8bb..6ac3956 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -536,6 +536,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 6472548..c15308a 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1787,6 +1787,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
@@ -1795,6 +1797,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.9.4

  parent reply	other threads:[~2017-06-21 12:51 UTC|newest]

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

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