From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:51704) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qz9cI-0006h2-QP for qemu-devel@nongnu.org; Thu, 01 Sep 2011 11:55:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qz9cH-0001j5-Lm for qemu-devel@nongnu.org; Thu, 01 Sep 2011 11:55:46 -0400 Received: from verein.lst.de ([213.95.11.211]:33334 helo=newverein.lst.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qz9cH-0001iq-Gv for qemu-devel@nongnu.org; Thu, 01 Sep 2011 11:55:45 -0400 Date: Thu, 1 Sep 2011 17:55:43 +0200 From: Christoph Hellwig Message-ID: <20110901155543.GA11219@lst.de> References: <20110901132755.GG14462@redhat.com> <20110901140526.GA9388@lst.de> <20110901143034.GJ14462@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110901143034.GJ14462@redhat.com> Subject: Re: [Qemu-devel] QEMU online guest disk resize wrt host block devices List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Daniel P. Berrange" Cc: Christoph Hellwig , qemu-devel@nongnu.org Please try the attached (untested) patch: 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,