Blame SOURCES/kvm-block-dirty-bitmap-change-semantics-of-enabled-predi.patch

383d26
From 7bcc4bb06fb8455874578fe3ad722600081e8d1c Mon Sep 17 00:00:00 2001
383d26
From: John Snow <jsnow@redhat.com>
383d26
Date: Wed, 3 Apr 2019 18:18:42 +0200
383d26
Subject: [PATCH 137/163] block/dirty-bitmap: change semantics of enabled
383d26
 predicate
383d26
383d26
RH-Author: John Snow <jsnow@redhat.com>
383d26
Message-id: <20190403181857.9693-7-jsnow@redhat.com>
383d26
Patchwork-id: 85427
383d26
O-Subject: [RHEL-7.7 qemu-kvm-rhev PATCH 06/21] block/dirty-bitmap: change semantics of enabled predicate
383d26
Bugzilla: 1677073
383d26
RH-Acked-by: Max Reitz <mreitz@redhat.com>
383d26
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
383d26
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
383d26
383d26
Currently, the enabled predicate means something like:
383d26
"the QAPI status of the bitmap is ACTIVE."
383d26
After this patch, it should mean exclusively:
383d26
"This bitmap is recording guest writes, and is allowed to do so."
383d26
383d26
In many places, this is how this predicate was already used.
383d26
Internal usages of the bitmap QPI can call user_locked to find out if
383d26
the bitmap is in use by an operation.
383d26
383d26
To accommodate this, modify the create_successor routine to now
383d26
explicitly disable the parent bitmap at creation time.
383d26
383d26
Justifications:
383d26
383d26
1. bdrv_dirty_bitmap_status suffers no change from the lack of
383d26
   1:1 parity with the new predicates because of the order in which
383d26
   the predicates are checked. This is now only for compatibility.
383d26
383d26
2. bdrv_set_dirty() is unchanged: pre-patch, it was skipping bitmaps that were
383d26
   disabled or had a successor, while post-patch it is only skipping bitmaps
383d26
   that are disabled. To accommodate this, create_successor now ensures that
383d26
   any bitmap with a successor is explicitly disabled.
383d26
383d26
3. qcow2_store_persistent_dirty_bitmaps: No functional change. This function
383d26
   cares only about the literal enabled bit, and makes no effort to check if
383d26
   the bitmap is in-use or not. After this patch there are still no ways to
383d26
   produce an enabled bitmap with a successor.
383d26
383d26
4. block_dirty_bitmap_enable_prepare
383d26
   block_dirty_bitmap_disable_prepare
383d26
   init_dirty_bitmap_migration
383d26
   nbd_export_new
383d26
383d26
   These functions care about the literal enabled bit,
383d26
   and already check user_locked separately.
383d26
383d26
Signed-off-by: John Snow <jsnow@redhat.com>
383d26
Reviewed-by: Eric Blake <eblake@redhat.com>
383d26
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
383d26
Message-id: 20190223000614.13894-5-jsnow@redhat.com
383d26
Signed-off-by: John Snow <jsnow@redhat.com>
383d26
(cherry picked from commit 8b2e20f64f25a5bf9a7cd45b4babdf2d7416f7ad)
383d26
Signed-off-by: John Snow <jsnow@redhat.com>
383d26
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
383d26
---
383d26
 block/dirty-bitmap.c | 9 +++++++--
383d26
 1 file changed, 7 insertions(+), 2 deletions(-)
383d26
383d26
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
383d26
index 7dc5b55..fa411f9 100644
383d26
--- a/block/dirty-bitmap.c
383d26
+++ b/block/dirty-bitmap.c
383d26
@@ -209,7 +209,7 @@ bool bdrv_dirty_bitmap_qmp_locked(BdrvDirtyBitmap *bitmap)
383d26
 /* Called with BQL taken.  */
383d26
 bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
383d26
 {
383d26
-    return !(bitmap->disabled || bitmap->successor);
383d26
+    return !bitmap->disabled;
383d26
 }
383d26
 
383d26
 /* Called with BQL taken.  */
383d26
@@ -236,6 +236,7 @@ static bool bdrv_dirty_bitmap_recording(BdrvDirtyBitmap *bitmap)
383d26
 /**
383d26
  * Create a successor bitmap destined to replace this bitmap after an operation.
383d26
  * Requires that the bitmap is not user_locked and has no successor.
383d26
+ * The successor will be enabled if the parent bitmap was.
383d26
  * Called with BQL taken.
383d26
  */
383d26
 int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
383d26
@@ -264,6 +265,7 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
383d26
 
383d26
     /* Successor will be on or off based on our current state. */
383d26
     child->disabled = bitmap->disabled;
383d26
+    bitmap->disabled = true;
383d26
 
383d26
     /* Install the successor and freeze the parent */
383d26
     bitmap->successor = child;
383d26
@@ -329,7 +331,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
383d26
 /**
383d26
  * In cases of failure where we can no longer safely delete the parent,
383d26
  * we may wish to re-join the parent and child/successor.
383d26
- * The merged parent will not be user_locked, nor explicitly re-enabled.
383d26
+ * The merged parent will not be user_locked.
383d26
+ * The marged parent will be enabled if and only if the successor was enabled.
383d26
  * Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken.
383d26
  */
383d26
 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BlockDriverState *bs,
383d26
@@ -347,6 +350,8 @@ BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BlockDriverState *bs,
383d26
         error_setg(errp, "Merging of parent and successor bitmap failed");
383d26
         return NULL;
383d26
     }
383d26
+
383d26
+    parent->disabled = successor->disabled;
383d26
     bdrv_release_dirty_bitmap_locked(successor);
383d26
     parent->successor = NULL;
383d26
 
383d26
-- 
383d26
1.8.3.1
383d26