From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:47495) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R1Fu3-0005RH-Tq for qemu-devel@nongnu.org; Wed, 07 Sep 2011 07:02:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R1Fu2-0003jm-O9 for qemu-devel@nongnu.org; Wed, 07 Sep 2011 07:02:47 -0400 Received: from verein.lst.de ([213.95.11.211]:43389 helo=newverein.lst.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R1Fu2-0003jf-JJ for qemu-devel@nongnu.org; Wed, 07 Sep 2011 07:02:46 -0400 Date: Wed, 7 Sep 2011 13:02:45 +0200 From: Christoph Hellwig Message-ID: <20110907110245.GA3477@lst.de> 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=us-ascii Content-Disposition: inline In-Reply-To: <20110901155543.GA11219@lst.de> Subject: [Qemu-devel] [PATCH] block: allow resizing of images residing on host devices List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Allow to resize images that reside on host devices up to the available space. This allows to grow images after resizing the device manually or vice versa. Reviewed-by: Christoph Hellwig 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,