From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=46836 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PgFKK-0003rP-Sx for qemu-devel@nongnu.org; Fri, 21 Jan 2011 06:38:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PgFKJ-0005YK-Rg for qemu-devel@nongnu.org; Fri, 21 Jan 2011 06:38:48 -0500 Received: from mail3-relais-sop.national.inria.fr ([192.134.164.104]:9271) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PgFKJ-0005YE-Lp for qemu-devel@nongnu.org; Fri, 21 Jan 2011 06:38:47 -0500 Subject: Re: [Qemu-devel] [PATCH] Fix block migration when the device size is not a multiple of 1 MB Mime-Version: 1.0 (Apple Message framework v1082) Content-Type: text/plain; charset=us-ascii From: Pierre Riteau In-Reply-To: <4D394F0A.9020608@redhat.com> Date: Fri, 21 Jan 2011 12:38:43 +0100 Content-Transfer-Encoding: quoted-printable Message-Id: <21D45D98-E550-4DAB-9252-44B471595DC5@irisa.fr> References: <1295449188-17877-1-git-send-email-Pierre.Riteau@irisa.fr> <4D394F0A.9020608@redhat.com> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: qemu-devel@nongnu.org, tamura.yoshiaki@lab.ntt.co.jp On 21 janv. 2011, at 10:16, Kevin Wolf wrote: > Am 19.01.2011 15:59, schrieb 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. >>=20 >> Fixed by calling bdrv_write with the correct size of the last block. >> --- >> block-migration.c | 16 +++++++++++++++- >> 1 files changed, 15 insertions(+), 1 deletions(-) >>=20 >> diff --git a/block-migration.c b/block-migration.c >> index 1475325..eeb9c62 100644 >> --- a/block-migration.c >> +++ b/block-migration.c >> @@ -635,6 +635,8 @@ static int block_load(QEMUFile *f, void *opaque, = int version_id) >> int64_t addr; >> BlockDriverState *bs; >> uint8_t *buf; >> + int64_t total_sectors; >> + int nr_sectors; >>=20 >> do { >> addr =3D qemu_get_be64(f); >> @@ -656,10 +658,22 @@ static int block_load(QEMUFile *f, void = *opaque, int version_id) >> return -EINVAL; >> } >>=20 >> + total_sectors =3D bdrv_getlength(bs) >> = BDRV_SECTOR_BITS; >> + if (total_sectors <=3D 0) { >> + fprintf(stderr, "Error getting length of block = device %s\n", device_name); >> + return -EINVAL; >> + } >=20 > Can you resend the patch with error_report(), as Yoshi mentioned? >=20 > Also, I would move the total_sectors calculation outside the loop - > though I have no idea how many iterations it typically has, so it = might > not improve things a lot. Actually, it is not possible to move the total_sectors calculation = outside the loop, since the loop can receive blocks from any device = (this is why each block is prefixed by the device name). I'm sending a new patch with a small optimization to avoid recalculating = total_sectors when the device doesn't change in the next iteration. --=20 Pierre Riteau -- PhD student, Myriads team, IRISA, Rennes, France http://perso.univ-rennes1.fr/pierre.riteau/