Merge branch 'stable-0.15' of git://git.qemu.org/qemu
This commit is contained in:
commit
e62ad8314a
|
@ -317,7 +317,8 @@ int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
|
||||||
{
|
{
|
||||||
BDRVQcowState *s = bs->opaque;
|
BDRVQcowState *s = bs->opaque;
|
||||||
QCowSnapshot *sn;
|
QCowSnapshot *sn;
|
||||||
int i, snapshot_index, l1_size2;
|
int i, snapshot_index;
|
||||||
|
int cur_l1_bytes, sn_l1_bytes;
|
||||||
|
|
||||||
snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
|
snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
|
||||||
if (snapshot_index < 0)
|
if (snapshot_index < 0)
|
||||||
|
@ -330,14 +331,19 @@ int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
|
||||||
if (qcow2_grow_l1_table(bs, sn->l1_size, true) < 0)
|
if (qcow2_grow_l1_table(bs, sn->l1_size, true) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
s->l1_size = sn->l1_size;
|
cur_l1_bytes = s->l1_size * sizeof(uint64_t);
|
||||||
l1_size2 = s->l1_size * sizeof(uint64_t);
|
sn_l1_bytes = sn->l1_size * sizeof(uint64_t);
|
||||||
|
|
||||||
|
if (cur_l1_bytes > sn_l1_bytes) {
|
||||||
|
memset(s->l1_table + sn->l1_size, 0, cur_l1_bytes - sn_l1_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
/* copy the snapshot l1 table to the current l1 table */
|
/* copy the snapshot l1 table to the current l1 table */
|
||||||
if (bdrv_pread(bs->file, sn->l1_table_offset,
|
if (bdrv_pread(bs->file, sn->l1_table_offset,
|
||||||
s->l1_table, l1_size2) != l1_size2)
|
s->l1_table, sn_l1_bytes) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
if (bdrv_pwrite_sync(bs->file, s->l1_table_offset,
|
if (bdrv_pwrite_sync(bs->file, s->l1_table_offset,
|
||||||
s->l1_table, l1_size2) < 0)
|
s->l1_table, cur_l1_bytes) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
for(i = 0;i < s->l1_size; i++) {
|
for(i = 0;i < s->l1_size; i++) {
|
||||||
be64_to_cpus(&s->l1_table[i]);
|
be64_to_cpus(&s->l1_table[i]);
|
||||||
|
|
Loading…
Reference in New Issue