From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MOEYV-0001ej-7x for qemu-devel@nongnu.org; Tue, 07 Jul 2009 13:34:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MOEYQ-0001dR-53 for qemu-devel@nongnu.org; Tue, 07 Jul 2009 13:34:10 -0400 Received: from [199.232.76.173] (port=45903 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MOEYP-0001dJ-Iy for qemu-devel@nongnu.org; Tue, 07 Jul 2009 13:34:06 -0400 Received: from verein.lst.de ([213.95.11.210]:57399) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_3DES_EDE_CBC_SHA1:24) (Exim 4.60) (envelope-from ) id 1MOEYO-0003Fa-63 for qemu-devel@nongnu.org; Tue, 07 Jul 2009 13:34:04 -0400 Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id n67HY168005246 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Tue, 7 Jul 2009 19:34:01 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-7.2) id n67HY1Vm005244 for qemu-devel@nongnu.org; Tue, 7 Jul 2009 19:34:01 +0200 Date: Tue, 7 Jul 2009 19:34:01 +0200 From: Christoph Hellwig Message-ID: <20090707173401.GA5145@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCH] sanitize ->bdrv_get_buffer / ->bdrv_put_buffer calling conventions List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org The VM state offset is an concept internal to the image format, it doesn't even have to be a traditional linear offset. So change the ->bdrv_get_buffer / ->bdrv_put_buffer calling convention to always pass a relative offset and add the VM state offset to it internally inside the qcow2 code. Signed-off-by: Christoph Hellwig Index: qemu/savevm.c =================================================================== --- qemu.orig/savevm.c 2009-07-07 18:42:42.103269394 +0200 +++ qemu/savevm.c 2009-07-07 19:23:16.577363547 +0200 @@ -337,46 +337,28 @@ fail: return NULL; } -typedef struct QEMUFileBdrv -{ - BlockDriverState *bs; - int64_t base_offset; -} QEMUFileBdrv; - static int block_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) { - QEMUFileBdrv *s = opaque; - bdrv_put_buffer(s->bs, buf, s->base_offset + pos, size); + bdrv_put_buffer(opaque, buf, pos, size); return size; } static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) { - QEMUFileBdrv *s = opaque; - return bdrv_get_buffer(s->bs, buf, s->base_offset + pos, size); + return bdrv_get_buffer(opaque, buf, pos, size); } static int bdrv_fclose(void *opaque) { - QEMUFileBdrv *s = opaque; - qemu_free(s); return 0; } -static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_writable) +static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable) { - QEMUFileBdrv *s; - - s = qemu_mallocz(sizeof(QEMUFileBdrv)); - - s->bs = bs; - s->base_offset = offset; - if (is_writable) - return qemu_fopen_ops(s, block_put_buffer, NULL, bdrv_fclose, NULL, NULL); - - return qemu_fopen_ops(s, NULL, block_get_buffer, bdrv_fclose, NULL, NULL); + return qemu_fopen_ops(bs, block_put_buffer, NULL, bdrv_fclose, NULL, NULL); + return qemu_fopen_ops(bs, NULL, block_get_buffer, bdrv_fclose, NULL, NULL); } QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, @@ -1069,7 +1051,6 @@ void do_savevm(Monitor *mon, const char BlockDriverState *bs, *bs1; QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; int must_delete, ret, i; - BlockDriverInfo bdi1, *bdi = &bdi1; QEMUFile *f; int saved_vm_running; uint32_t vm_state_size; @@ -1119,14 +1100,8 @@ void do_savevm(Monitor *mon, const char #endif sn->vm_clock_nsec = qemu_get_clock(vm_clock); - if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) { - monitor_printf(mon, "Device %s does not support VM state snapshots\n", - bdrv_get_device_name(bs)); - goto the_end; - } - /* save the VM state */ - f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 1); + f = qemu_fopen_bdrv(bs, 1); if (!f) { monitor_printf(mon, "Could not open VM state file\n"); goto the_end; @@ -1170,7 +1145,6 @@ void do_savevm(Monitor *mon, const char void do_loadvm(Monitor *mon, const char *name) { BlockDriverState *bs, *bs1; - BlockDriverInfo bdi1, *bdi = &bdi1; QEMUSnapshotInfo sn; QEMUFile *f; int i, ret; @@ -1218,19 +1192,13 @@ void do_loadvm(Monitor *mon, const char } } - if (bdrv_get_info(bs, bdi) < 0 || bdi->vm_state_offset <= 0) { - monitor_printf(mon, "Device %s does not support VM state snapshots\n", - bdrv_get_device_name(bs)); - return; - } - /* Don't even try to load empty VM states */ ret = bdrv_snapshot_find(bs, &sn, name); if ((ret >= 0) && (sn.vm_state_size == 0)) goto the_end; /* restore the VM state */ - f = qemu_fopen_bdrv(bs, bdi->vm_state_offset, 0); + f = qemu_fopen_bdrv(bs, 0); if (!f) { monitor_printf(mon, "Could not open VM state file\n"); goto the_end; diff --git a/block/qcow2.c b/block/qcow2.c index 20c114b..6b8eefa 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -897,12 +897,16 @@ static void qcow_flush(BlockDriverState *bs) bdrv_flush(s->hd); } +static int64_t qcow_vm_state_offset(BDRVQcowState *s) +{ + return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits); +} + static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) { BDRVQcowState *s = bs->opaque; bdi->cluster_size = s->cluster_size; - bdi->vm_state_offset = (int64_t)s->l1_vm_state_index << - (s->cluster_bits + s->l2_bits); + bdi->vm_state_offset = qcow_vm_state_offset(s); return 0; } @@ -935,10 +939,11 @@ static void dump_refcounts(BlockDriverState *bs) static int qcow_put_buffer(BlockDriverState *bs, const uint8_t *buf, int64_t pos, int size) { + BDRVQcowState *s = bs->opaque; int growable = bs->growable; bs->growable = 1; - bdrv_pwrite(bs, pos, buf, size); + bdrv_pwrite(bs, qcow_vm_state_offset(s) + pos, buf, size); bs->growable = growable; return size; @@ -947,11 +952,12 @@ static int qcow_put_buffer(BlockDriverState *bs, const uint8_t *buf, static int qcow_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size) { + BDRVQcowState *s = bs->opaque; int growable = bs->growable; int ret; bs->growable = 1; - ret = bdrv_pread(bs, pos, buf, size); + ret = bdrv_pread(bs, qcow_vm_state_offset(s) + pos, buf, size); bs->growable = growable; return ret;