From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=60819 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PhTfq-000199-Vp for qemu-devel@nongnu.org; Mon, 24 Jan 2011 16:10:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PhTfp-0007UR-6B for qemu-devel@nongnu.org; Mon, 24 Jan 2011 16:10:06 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35789) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PhTfo-0007UF-N0 for qemu-devel@nongnu.org; Mon, 24 Jan 2011 16:10:05 -0500 From: Kevin Wolf Date: Mon, 24 Jan 2011 22:10:44 +0100 Message-Id: <1295903452-18017-16-git-send-email-kwolf@redhat.com> In-Reply-To: <1295903452-18017-1-git-send-email-kwolf@redhat.com> References: <1295903452-18017-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 15/23] Fix block migration when the device size is not a multiple of 1 MB List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Pierre Riteau b02bea3a85cc939f09aa674a3f1e4f36d418c007 added a check on the return value of bdrv_write and aborts migration when it fails. However, if the size of the block device to migrate is not a multiple of BLOCK_SIZE (currently 1 MB), the last bdrv_write will fail with -EIO. Fixed by calling bdrv_write with the correct size of the last block. Signed-off-by: Pierre Riteau Signed-off-by: Kevin Wolf --- block-migration.c | 22 ++++++++++++++++++++-- 1 files changed, 20 insertions(+), 2 deletions(-) diff --git a/block-migration.c b/block-migration.c index 60b9fc0..c9d3e81 100644 --- a/block-migration.c +++ b/block-migration.c @@ -638,8 +638,10 @@ static int block_load(QEMUFile *f, void *opaque, int version_id) int len, flags; char device_name[256]; int64_t addr; - BlockDriverState *bs; + BlockDriverState *bs, *bs_prev = NULL; uint8_t *buf; + int64_t total_sectors = 0; + int nr_sectors; do { addr = qemu_get_be64(f); @@ -661,10 +663,26 @@ static int block_load(QEMUFile *f, void *opaque, int version_id) return -EINVAL; } + if (bs != bs_prev) { + bs_prev = bs; + total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS; + if (total_sectors <= 0) { + error_report("Error getting length of block device %s\n", + device_name); + return -EINVAL; + } + } + + if (total_sectors - addr < BDRV_SECTORS_PER_DIRTY_CHUNK) { + nr_sectors = total_sectors - addr; + } else { + nr_sectors = BDRV_SECTORS_PER_DIRTY_CHUNK; + } + buf = qemu_malloc(BLOCK_SIZE); qemu_get_buffer(f, buf, BLOCK_SIZE); - ret = bdrv_write(bs, addr, buf, BDRV_SECTORS_PER_DIRTY_CHUNK); + ret = bdrv_write(bs, addr, buf, nr_sectors); qemu_free(buf); if (ret < 0) { -- 1.7.2.3