dirty-bitmap: Avoid size query failure during truncate
commit1b6cc579ded4f9d7923d9d59147512edd623f4c0
authorEric Blake <eblake@redhat.com>
Mon, 25 Sep 2017 14:55:11 +0000 (25 09:55 -0500)
committerKevin Wolf <kwolf@redhat.com>
Fri, 6 Oct 2017 14:28:58 +0000 (6 16:28 +0200)
tree4507d94247eb7cbb45eccc6b291ab317e261e04e
parentdfe55c35772b7ebc6f282a94d4048c9f85b7b26b
dirty-bitmap: Avoid size query failure during truncate

We've previously fixed several places where we failed to account
for possible errors from bdrv_nb_sectors().  Fix another one by
making bdrv_dirty_bitmap_truncate() take the new size from the
caller instead of querying itself; then adjust the sole caller
bdrv_truncate() to pass the size just determined by a successful
resize, or to reuse the size given to the original truncate
operation when refresh_total_sectors() was not able to confirm the
actual size (the two sizes can potentially differ according to
rounding constraints), thus avoiding sizing the bitmaps to -1.
This also fixes a bug where not all failure paths in
bdrv_truncate() would set errp.

Note that bdrv_truncate() is still a bit awkward.  We may want
to revisit it later and clean up things to better guarantee that
a resize attempt either fails cleanly up front, or cannot fail
after guest-visible changes have been made (if temporary changes
are made, then they need to be cleanly rolled back).  But that
is a task for another day; for now, the goal is the bare minimum
fix to ensure that just bdrv_dirty_bitmap_truncate() cannot fail.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block.c
block/dirty-bitmap.c
include/block/dirty-bitmap.h