From patchwork Wed Sep 7 11:02:45 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 113740 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 9DDDAB6F7D for ; Wed, 7 Sep 2011 21:02:59 +1000 (EST) Received: from localhost ([::1]:37549 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R1FuC-0005RR-BG for incoming@patchwork.ozlabs.org; Wed, 07 Sep 2011 07:02:56 -0400 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 Received: by newverein.lst.de (Postfix, from userid 2407) id 2739F14359; Wed, 7 Sep 2011 13:02:45 +0200 (CEST) Date: Wed, 7 Sep 2011 13:02:45 +0200 From: Christoph Hellwig To: qemu-devel@nongnu.org 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-Disposition: inline In-Reply-To: <20110901155543.GA11219@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 213.95.11.211 Subject: [Qemu-devel] [PATCH] block: allow resizing of images residing on host devices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@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,