From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:53116) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QzVEs-0004bp-7K for qemu-devel@nongnu.org; Fri, 02 Sep 2011 11:01:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QzVEq-0002bB-Bn for qemu-devel@nongnu.org; Fri, 02 Sep 2011 11:01:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:20553) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QzVEq-0002b1-3G for qemu-devel@nongnu.org; Fri, 02 Sep 2011 11:01:00 -0400 Date: Fri, 2 Sep 2011 16:00:56 +0100 From: "Daniel P. Berrange" Message-ID: <20110902150056.GG27508@redhat.com> References: <20110901132755.GG14462@redhat.com> <20110901140526.GA9388@lst.de> <20110901143034.GJ14462@redhat.com> <20110901155543.GA11219@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20110901155543.GA11219@lst.de> Subject: Re: [Qemu-devel] QEMU online guest disk resize wrt host block devices Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Christoph Hellwig Cc: qemu-devel@nongnu.org On Thu, Sep 01, 2011 at 05:55:43PM +0200, Christoph Hellwig wrote: > Please try the attached (untested) patch: Yes, this patch worked succesfully with the following test case: $ dd if=/dev/zero of=loop.img bs=1M seek=100 count=0 $ losetup -f loop.img $ ./x86_64-softmmu/qemu-system-x86_64 -hda /dev/loop0 -monitor stdio (qemu) info block ide0-hd0: removable=0 file=/dev/loop0 sectors=204800 ro=0 drv=raw encrypted=0 ide1-cd0: removable=1 locked=0 [not inserted] floppy0: removable=1 locked=0 [not inserted] sd0: removable=1 locked=0 [not inserted] $ dd if=/dev/zero of=loop.img bs=1M seek=200 count=0 $ losetup -c /dev/loop0 (qemu) block_resize ide0-hd0 200 (qemu) info block ide0-hd0: removable=0 file=/dev/loop0 sectors=409600 ro=0 drv=raw encrypted=0 ide1-cd0: removable=1 locked=0 [not inserted] floppy0: removable=1 locked=0 [not inserted] sd0: removable=1 locked=0 [not inserted] Regards, Daniel > Index: qemu/block/raw-posix.c > =================================================================== > --- qemu.orig/block/raw-posix.c 2011-09-01 17:37:42.579651525 +0200 > +++ qemu/block/raw-posix.c 2011-09-01 17:43:28.882967337 +0200 > @@ -645,10 +645,23 @@ static void raw_close(BlockDriverState * > static int raw_truncate(BlockDriverState *bs, int64_t offset) > { > BDRVRawState *s = bs->opaque; > - if (s->type != FTYPE_FILE) > - return -ENOTSUP; > - if (ftruncate(s->fd, offset) < 0) > + struct stat st; > + > + if (fstat(s->fd, &st)) > return -errno; > + > + if (S_ISREG(st.st_mode)) { > + if (ftruncate(s->fd, offset) < 0) > + return -errno; > + } else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) { > + if (offset > raw_getlength(bs)) { > + return -EINVAL; > + } > + return 0; > + > + } else { > + return -ENOTSUP; > + } > return 0; > } > > @@ -1167,6 +1180,7 @@ static BlockDriver bdrv_host_device = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > @@ -1288,6 +1302,7 @@ static BlockDriver bdrv_host_floppy = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > @@ -1389,6 +1404,7 @@ static BlockDriver bdrv_host_cdrom = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size, > @@ -1510,6 +1526,7 @@ static BlockDriver bdrv_host_cdrom = { > > .bdrv_read = raw_read, > .bdrv_write = raw_write, > + .bdrv_truncate = raw_truncate, > .bdrv_getlength = raw_getlength, > .bdrv_get_allocated_file_size > = raw_get_allocated_file_size,