From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ViLaf-0005dx-6V for qemu-devel@nongnu.org; Mon, 18 Nov 2013 04:58:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ViLaa-0002Ca-81 for qemu-devel@nongnu.org; Mon, 18 Nov 2013 04:57:57 -0500 Received: from mx1.redhat.com ([209.132.183.28]:63896) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ViLaa-0002CC-0a for qemu-devel@nongnu.org; Mon, 18 Nov 2013 04:57:52 -0500 Date: Mon, 18 Nov 2013 10:57:46 +0100 From: Stefan Hajnoczi Message-ID: <20131118095746.GA16693@stefanha-thinkpad.redhat.com> References: <1384416928-3441-1-git-send-email-cyliu@suse.com> <20131115093846.GJ12545@stefanha-thinkpad.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: Re: [Qemu-devel] [PATCH] qemu-img: set nocow flag to new file List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Chunyan Liu Cc: Kevin Wolf , Stefan Hajnoczi , qemu-devel@nongnu.org On Mon, Nov 18, 2013 at 12:54:59PM +0800, Chunyan Liu wrote: > 2013/11/15 Stefan Hajnoczi > > > On Thu, Nov 14, 2013 at 04:15:28PM +0800, Chunyan Liu wrote: > > > Set NOCOW flag to newly created images to solve performance issues on > > btrfs. > > > > > > Btrfs has terrible performance when hosting VM images, even more when > > the guest > > > in those VM are also using btrfs as file system. One way to mitigate > > this bad > > > performance is to turn off COW attributes on VM files (since having copy > > on > > > write for this kind of data is not useful). > > > > > > Signed-off-by: Chunyan Liu > > > --- > > > block/raw-posix.c | 6 ++++++ > > > block/vdi.c | 7 +++++++ > > > block/vmdk.c | 7 +++++++ > > > include/qemu-common.h | 9 +++++++++ > > > 4 files changed, 29 insertions(+), 0 deletions(-) > > > > > > diff --git a/block/raw-posix.c b/block/raw-posix.c > > > index f6d48bb..4a3e9d0 100644 > > > --- a/block/raw-posix.c > > > +++ b/block/raw-posix.c > > > @@ -1072,6 +1072,12 @@ static int raw_create(const char *filename, > > QEMUOptionParameter *options, > > > result = -errno; > > > error_setg_errno(errp, -result, "Could not create file"); > > > } else { > > > +#ifdef __linux__ > > > + /* set NOCOW flag to solve performance issue on fs like btrfs */ > > > + int attr; > > > + attr = FS_NOCOW_FL; > > > + ioctl(fd, FS_IOC_SETFLAGS, &attr); > > > +#endif > > This should be optional and I'm not sure it should be the default. > > > > Rationale: If you're on btrfs you probably expect the copy-on-write and > > snapshot features of the file system. We shouldn't silently disable > > that unless the user asks for it. > > > > > The problem is: if users want to use copy-on-write (e.g, for snapshotting) > and > don't care about performance degrade, they still be able to issue "chattr" > to > change it to be COW. However, if a file is created as COW, but later users > care > about performance, there is no way to switch to NOCOW per file. NOCOW > should be > set to new or empty file only on btrfs. When the NOCOW attribute is set on a file, reflink copying (aka file-level snapshots) do not work: $ cp --reflink test.img test-snapshot.img This produces EINVAL. It is a regression if qemu-img create suddenly starts breaking this standard btrfs feature for existing users. Please make it a .bdrv_create() option which is off by default to avoid breaking existing users' workflows/scripts. The result should be something like: $ qemu-img create test.img 8G # file has NOCOW cleared $ qemu-img create -o nocow=on test.img 8G # file has NOCOW set Stefan