Am 29.08.2013 11:18, schrieb Kevin Wolf:
Am 28.08.2013 um 16:55 hat Max Reitz geschrieben:
The pre-write overlap check function is now called before most of the
qcow2 writes (aborting it on collision or other error).

Signed-off-by: Max Reitz <mre...@redhat.com>
---
  block/qcow2-cache.c    | 17 +++++++++++++++++
  block/qcow2-cluster.c  | 21 +++++++++++++++++++++
  block/qcow2-snapshot.c | 22 ++++++++++++++++++++++
  block/qcow2.c          | 36 +++++++++++++++++++++++++++++++++++-
  4 files changed, 95 insertions(+), 1 deletion(-)
@@ -1753,10 +1779,18 @@ static int qcow2_save_vmstate(BlockDriverState *bs, 
QEMUIOVector *qiov,
      BDRVQcowState *s = bs->opaque;
      int growable = bs->growable;
      int ret;
+    int64_t offset = qcow2_vm_state_offset(s) + pos;
BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_SAVE);
      bs->growable = 1;
-    ret = bdrv_pwritev(bs, qcow2_vm_state_offset(s) + pos, qiov);
+
+    ret = qcow2_pre_write_overlap_check(bs, QCOW2_OL_DEFAULT, offset,
+                                        qiov->size);
+    if (ret < 0) {
+        return ret;
+    }
+
+    ret = bdrv_pwritev(bs, offset, qiov);
      bs->growable = growable;
return ret;
Sorry for not catching it in v1, this one is actually wrong. The
bdrv_pwritev() is against bs, not bs->file, so you would be comparing
virtual/guest offsets with physical/host offsets.
Oh, yes, sorry; thanks for noticing. I do this mistake way too often – I think it's time for some regex to catch it…

Max

Reply via email to