qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [6994] Fix savevm after BDRV_FILE size enforcement


From: Anthony Liguori
Subject: [Qemu-devel] [6994] Fix savevm after BDRV_FILE size enforcement
Date: Sun, 05 Apr 2009 19:10:55 +0000

Revision: 6994
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6994
Author:   aliguori
Date:     2009-04-05 19:10:55 +0000 (Sun, 05 Apr 2009)
Log Message:
-----------
Fix savevm after BDRV_FILE size enforcement

We now enforce that you cannot write beyond the end of a non-growable file.
qcow2 files are not growable but we rely on them being growable to do
savevm/loadvm.  Temporarily allow them to be growable by introducing a new
API specifically for savevm read/write operations.

Reported-by: malc
Signed-off-by: Anthony Liguori <address@hidden>

Modified Paths:
--------------
    trunk/block-qcow2.c
    trunk/block.c
    trunk/block.h
    trunk/block_int.h
    trunk/savevm.c

Modified: trunk/block-qcow2.c
===================================================================
--- trunk/block-qcow2.c 2009-04-05 19:10:50 UTC (rev 6993)
+++ trunk/block-qcow2.c 2009-04-05 19:10:55 UTC (rev 6994)
@@ -2721,6 +2721,31 @@
 #endif
 #endif
 
+static int qcow_put_buffer(BlockDriverState *bs, const uint8_t *buf,
+                           int64_t pos, int size)
+{
+    int growable = bs->growable;
+
+    bs->growable = 1;
+    bdrv_pwrite(bs, pos, buf, size);
+    bs->growable = growable;
+
+    return size;
+}
+
+static int qcow_get_buffer(BlockDriverState *bs, uint8_t *buf,
+                           int64_t pos, int size)
+{
+    int growable = bs->growable;
+    int ret;
+
+    bs->growable = 1;
+    ret = bdrv_pread(bs, pos, buf, size);
+    bs->growable = growable;
+
+    return ret;
+}
+
 BlockDriver bdrv_qcow2 = {
     .format_name       = "qcow2",
     .instance_size     = sizeof(BDRVQcowState),
@@ -2745,5 +2770,8 @@
     .bdrv_snapshot_list        = qcow_snapshot_list,
     .bdrv_get_info     = qcow_get_info,
 
+    .bdrv_put_buffer    = qcow_put_buffer,
+    .bdrv_get_buffer    = qcow_get_buffer,
+
     .bdrv_create2 = qcow_create2,
 };

Modified: trunk/block.c
===================================================================
--- trunk/block.c       2009-04-05 19:10:50 UTC (rev 6993)
+++ trunk/block.c       2009-04-05 19:10:55 UTC (rev 6994)
@@ -1146,6 +1146,26 @@
     return drv->bdrv_get_info(bs, bdi);
 }
 
+int bdrv_put_buffer(BlockDriverState *bs, const uint8_t *buf, int64_t pos, int 
size)
+{
+    BlockDriver *drv = bs->drv;
+    if (!drv)
+        return -ENOMEDIUM;
+    if (!drv->bdrv_put_buffer)
+        return -ENOTSUP;
+    return drv->bdrv_put_buffer(bs, buf, pos, size);
+}
+
+int bdrv_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size)
+{
+    BlockDriver *drv = bs->drv;
+    if (!drv)
+        return -ENOMEDIUM;
+    if (!drv->bdrv_get_buffer)
+        return -ENOTSUP;
+    return drv->bdrv_get_buffer(bs, buf, pos, size);
+}
+
 /**************************************************************/
 /* handling of snapshots */
 

Modified: trunk/block.h
===================================================================
--- trunk/block.h       2009-04-05 19:10:50 UTC (rev 6993)
+++ trunk/block.h       2009-04-05 19:10:55 UTC (rev 6994)
@@ -178,4 +178,9 @@
                   const char *base_path,
                   const char *filename);
 
+int bdrv_put_buffer(BlockDriverState *bs, const uint8_t *buf,
+                    int64_t pos, int size);
+
+int bdrv_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size);
+
 #endif

Modified: trunk/block_int.h
===================================================================
--- trunk/block_int.h   2009-04-05 19:10:50 UTC (rev 6993)
+++ trunk/block_int.h   2009-04-05 19:10:55 UTC (rev 6994)
@@ -78,6 +78,11 @@
                               QEMUSnapshotInfo **psn_info);
     int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
 
+    int (*bdrv_put_buffer)(BlockDriverState *bs, const uint8_t *buf,
+                           int64_t pos, int size);
+    int (*bdrv_get_buffer)(BlockDriverState *bs, uint8_t *buf,
+                           int64_t pos, int size);
+
     /* removable device specific */
     int (*bdrv_is_inserted)(BlockDriverState *bs);
     int (*bdrv_media_changed)(BlockDriverState *bs);

Modified: trunk/savevm.c
===================================================================
--- trunk/savevm.c      2009-04-05 19:10:50 UTC (rev 6993)
+++ trunk/savevm.c      2009-04-05 19:10:55 UTC (rev 6994)
@@ -310,18 +310,18 @@
     int64_t base_offset;
 } QEMUFileBdrv;
 
-static int bdrv_put_buffer(void *opaque, const uint8_t *buf,
+static int block_put_buffer(void *opaque, const uint8_t *buf,
                            int64_t pos, int size)
 {
     QEMUFileBdrv *s = opaque;
-    bdrv_pwrite(s->bs, s->base_offset + pos, buf, size);
+    bdrv_put_buffer(s->bs, buf, s->base_offset + pos, size);
     return size;
 }
 
-static int bdrv_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
+static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
 {
     QEMUFileBdrv *s = opaque;
-    return bdrv_pread(s->bs, s->base_offset + pos, buf, size);
+    return bdrv_get_buffer(s->bs, buf, s->base_offset + pos, size);
 }
 
 static int bdrv_fclose(void *opaque)
@@ -341,9 +341,9 @@
     s->base_offset = offset;
 
     if (is_writable)
-        return qemu_fopen_ops(s, bdrv_put_buffer, NULL, bdrv_fclose, NULL);
+        return qemu_fopen_ops(s, block_put_buffer, NULL, bdrv_fclose, NULL);
 
-    return qemu_fopen_ops(s, NULL, bdrv_get_buffer, bdrv_fclose, NULL);
+    return qemu_fopen_ops(s, NULL, block_get_buffer, bdrv_fclose, NULL);
 }
 
 QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]