On 04/11/2018 07:26 AM, Vladimir Sementsov-Ogievskiy wrote:
Checking reopen by existence of some bitmaps is wrong, as it may be
some other bitmaps, or on the other hand, user may remove bitmaps. This
criteria is bad. To simplify things and make behavior more predictable
let's just add a flag to remember, that we've already tried to load
bitmaps on open and do not want do it again.
Wording suggestion:
Checking whether we are reopening an image based on the existence of
some bitmaps is wrong, as the set of bitmaps may have changed (for
example, the user may have added or removed bitmaps in the meantime).
To simplify things and make behavior more predictable, let's just add a
flag to remember whether we've already tried to load bitmaps, so that we
only attempt it on the initial open.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block/qcow2.h | 1 +
block/qcow2.c | 16 ++++++++--------
2 files changed, 9 insertions(+), 8 deletions(-)
@@ -1480,10 +1481,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState
*bs, QDict *options,
s->autoclear_features &= QCOW2_AUTOCLEAR_MASK;
}
- if (bdrv_dirty_bitmap_next(bs, NULL)) {
- /* It's some kind of reopen with already existing dirty bitmaps. There
- * are no known cases where we need loading bitmaps in such situation,
- * so it's safer don't load them.
+ if (s->dirty_bitmaps_loaded) {
+ /* It's some kind of reopen. There are no known cases where we need
+ * loading bitmaps in such situation, so it's safer don't load them.
Pre-existing wording, but sounds better as:
There are no known cases where we need to reload bitmaps in such a
situation, so it's safer to skip them.
*
* Moreover, if we have some readonly bitmaps and we are reopening for
* rw we should reopen bitmaps correspondingly.
@@ -1491,13 +1491,13 @@ static int coroutine_fn qcow2_do_open(BlockDriverState
*bs, QDict *options,
if (bdrv_has_readonly_bitmaps(bs) &&
!bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE))
{
- bool header_updated = false;
qcow2_reopen_bitmaps_rw_hint(bs, &header_updated, &local_err);
- update_header = update_header && !header_updated;
}
- } else if (qcow2_load_dirty_bitmaps(bs, &local_err)) {
- update_header = false;
+ } else {
+ header_updated = qcow2_load_dirty_bitmaps(bs, &local_err);
+ s->dirty_bitmaps_loaded = true;
}
+ update_header = update_header && !header_updated;
Could write this as 'update_header &= !header_updated;'