9ae3a8
From bff9b33a3c4e0757c1e779ebedbffa391d926ecb Mon Sep 17 00:00:00 2001
9ae3a8
From: Max Reitz <mreitz@redhat.com>
9ae3a8
Date: Mon, 4 Nov 2013 22:31:52 +0100
9ae3a8
Subject: [PATCH 01/87] block: drop bs_snapshots global variable
9ae3a8
9ae3a8
RH-Author: Max Reitz <mreitz@redhat.com>
9ae3a8
Message-id: <1383604354-12743-2-git-send-email-mreitz@redhat.com>
9ae3a8
Patchwork-id: 55301
9ae3a8
O-Subject: [RHEL-7.0 qemu-kvm PATCH 01/43] block: drop bs_snapshots global variable
9ae3a8
Bugzilla: 1026524
9ae3a8
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
RH-Acked-by: Fam Zheng <famz@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
9ae3a8
From: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
9ae3a8
BZ: 1026524
9ae3a8
9ae3a8
The bs_snapshots global variable points to the BlockDriverState which
9ae3a8
will be used to save vmstate.  This is really a savevm.c concept but was
9ae3a8
moved into block.c:bdrv_snapshots() when it became clear that hotplug
9ae3a8
could result in a dangling pointer.
9ae3a8
9ae3a8
While auditing the block layer's global state I came upon bs_snapshots
9ae3a8
and realized that a variable is not necessary here.  Simply find the
9ae3a8
first BlockDriverState capable of internal snapshots each time this is
9ae3a8
needed.
9ae3a8
9ae3a8
The behavior of bdrv_snapshots() is preserved across hotplug because new
9ae3a8
drives are always appended to the bdrv_states list.  This means that
9ae3a8
calling the new find_vmstate_bs() function is idempotent - it returns
9ae3a8
the same BlockDriverState unless it was hot-unplugged.
9ae3a8
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
Reviewed-by: Eric Blake <eblake@redhat.com>
9ae3a8
Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
9ae3a8
Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
9ae3a8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
(cherry picked from commit 29d782710f87f01991bfc85cd9bef7d15280a5e2)
9ae3a8
9ae3a8
Signed-off-by: Max Reitz <mreitz@redhat.com>
9ae3a8
---
9ae3a8
 block.c               | 28 ----------------------------
9ae3a8
 include/block/block.h |  1 -
9ae3a8
 savevm.c              | 19 +++++++++++++++----
9ae3a8
 3 files changed, 15 insertions(+), 33 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 block.c               |   28 ----------------------------
9ae3a8
 include/block/block.h |    1 -
9ae3a8
 savevm.c              |   19 +++++++++++++++----
9ae3a8
 3 files changed, 15 insertions(+), 33 deletions(-)
9ae3a8
9ae3a8
diff --git a/block.c b/block.c
9ae3a8
index fdff92f..84a3a8d 100644
9ae3a8
--- a/block.c
9ae3a8
+++ b/block.c
9ae3a8
@@ -99,9 +99,6 @@ static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
9ae3a8
 static QLIST_HEAD(, BlockDriver) bdrv_drivers =
9ae3a8
     QLIST_HEAD_INITIALIZER(bdrv_drivers);
9ae3a8
 
9ae3a8
-/* The device to use for VM snapshots */
9ae3a8
-static BlockDriverState *bs_snapshots;
9ae3a8
-
9ae3a8
 /* If non-zero, use only whitelisted block drivers */
9ae3a8
 static int use_bdrv_whitelist;
9ae3a8
 
9ae3a8
@@ -1384,9 +1381,6 @@ void bdrv_close(BlockDriverState *bs)
9ae3a8
     notifier_list_notify(&bs->close_notifiers, bs);
9ae3a8
 
9ae3a8
     if (bs->drv) {
9ae3a8
-        if (bs == bs_snapshots) {
9ae3a8
-            bs_snapshots = NULL;
9ae3a8
-        }
9ae3a8
         if (bs->backing_hd) {
9ae3a8
             bdrv_delete(bs->backing_hd);
9ae3a8
             bs->backing_hd = NULL;
9ae3a8
@@ -1619,7 +1613,6 @@ void bdrv_delete(BlockDriverState *bs)
9ae3a8
 
9ae3a8
     bdrv_close(bs);
9ae3a8
 
9ae3a8
-    assert(bs != bs_snapshots);
9ae3a8
     g_free(bs);
9ae3a8
 }
9ae3a8
 
9ae3a8
@@ -1663,9 +1656,6 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
9ae3a8
 {
9ae3a8
     bs->dev_ops = ops;
9ae3a8
     bs->dev_opaque = opaque;
9ae3a8
-    if (bdrv_dev_has_removable_media(bs) && bs == bs_snapshots) {
9ae3a8
-        bs_snapshots = NULL;
9ae3a8
-    }
9ae3a8
 }
9ae3a8
 
9ae3a8
 void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
9ae3a8
@@ -3493,24 +3483,6 @@ int bdrv_is_snapshot(BlockDriverState *bs)
9ae3a8
     return !!(bs->open_flags & BDRV_O_SNAPSHOT);
9ae3a8
 }
9ae3a8
 
9ae3a8
-BlockDriverState *bdrv_snapshots(void)
9ae3a8
-{
9ae3a8
-    BlockDriverState *bs;
9ae3a8
-
9ae3a8
-    if (bs_snapshots) {
9ae3a8
-        return bs_snapshots;
9ae3a8
-    }
9ae3a8
-
9ae3a8
-    bs = NULL;
9ae3a8
-    while ((bs = bdrv_next(bs))) {
9ae3a8
-        if (bdrv_can_snapshot(bs)) {
9ae3a8
-            bs_snapshots = bs;
9ae3a8
-            return bs;
9ae3a8
-        }
9ae3a8
-    }
9ae3a8
-    return NULL;
9ae3a8
-}
9ae3a8
-
9ae3a8
 int bdrv_snapshot_create(BlockDriverState *bs,
9ae3a8
                          QEMUSnapshotInfo *sn_info)
9ae3a8
 {
9ae3a8
diff --git a/include/block/block.h b/include/block/block.h
9ae3a8
index bc1f5f6..3b3f40e 100644
9ae3a8
--- a/include/block/block.h
9ae3a8
+++ b/include/block/block.h
9ae3a8
@@ -362,7 +362,6 @@ BlockInfo *bdrv_query_info(BlockDriverState *s);
9ae3a8
 BlockStats *bdrv_query_stats(const BlockDriverState *bs);
9ae3a8
 int bdrv_can_snapshot(BlockDriverState *bs);
9ae3a8
 int bdrv_is_snapshot(BlockDriverState *bs);
9ae3a8
-BlockDriverState *bdrv_snapshots(void);
9ae3a8
 int bdrv_snapshot_create(BlockDriverState *bs,
9ae3a8
                          QEMUSnapshotInfo *sn_info);
9ae3a8
 int bdrv_snapshot_goto(BlockDriverState *bs,
9ae3a8
diff --git a/savevm.c b/savevm.c
9ae3a8
index 1ed7f05..d9f3787 100644
9ae3a8
--- a/savevm.c
9ae3a8
+++ b/savevm.c
9ae3a8
@@ -2262,6 +2262,17 @@ out:
9ae3a8
     return ret;
9ae3a8
 }
9ae3a8
 
9ae3a8
+static BlockDriverState *find_vmstate_bs(void)
9ae3a8
+{
9ae3a8
+    BlockDriverState *bs = NULL;
9ae3a8
+    while ((bs = bdrv_next(bs))) {
9ae3a8
+        if (bdrv_can_snapshot(bs)) {
9ae3a8
+            return bs;
9ae3a8
+        }
9ae3a8
+    }
9ae3a8
+    return NULL;
9ae3a8
+}
9ae3a8
+
9ae3a8
 static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
9ae3a8
                               const char *name)
9ae3a8
 {
9ae3a8
@@ -2338,7 +2349,7 @@ void do_savevm(Monitor *mon, const QDict *qdict)
9ae3a8
         }
9ae3a8
     }
9ae3a8
 
9ae3a8
-    bs = bdrv_snapshots();
9ae3a8
+    bs = find_vmstate_bs();
9ae3a8
     if (!bs) {
9ae3a8
         monitor_printf(mon, "No block device can accept snapshots\n");
9ae3a8
         return;
9ae3a8
@@ -2440,7 +2451,7 @@ int load_vmstate(const char *name)
9ae3a8
     QEMUFile *f;
9ae3a8
     int ret;
9ae3a8
 
9ae3a8
-    bs_vm_state = bdrv_snapshots();
9ae3a8
+    bs_vm_state = find_vmstate_bs();
9ae3a8
     if (!bs_vm_state) {
9ae3a8
         error_report("No block device supports snapshots");
9ae3a8
         return -ENOTSUP;
9ae3a8
@@ -2519,7 +2530,7 @@ void do_delvm(Monitor *mon, const QDict *qdict)
9ae3a8
     int ret;
9ae3a8
     const char *name = qdict_get_str(qdict, "name");
9ae3a8
 
9ae3a8
-    bs = bdrv_snapshots();
9ae3a8
+    bs = find_vmstate_bs();
9ae3a8
     if (!bs) {
9ae3a8
         monitor_printf(mon, "No block device supports snapshots\n");
9ae3a8
         return;
9ae3a8
@@ -2551,7 +2562,7 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict)
9ae3a8
     int *available_snapshots;
9ae3a8
     char buf[256];
9ae3a8
 
9ae3a8
-    bs = bdrv_snapshots();
9ae3a8
+    bs = find_vmstate_bs();
9ae3a8
     if (!bs) {
9ae3a8
         monitor_printf(mon, "No available block device supports snapshots\n");
9ae3a8
         return;
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8