Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:Update
libvirt.401
a9fd30e6-storagevol-add-nocow-to-vol-xml.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File a9fd30e6-storagevol-add-nocow-to-vol-xml.patch of Package libvirt.401
From a9fd30e6332a04a8b5ba409dc738ecefa5c1b735 Mon Sep 17 00:00:00 2001 From: Chunyan Liu <cyliu@suse.com> Date: Tue, 15 Jul 2014 16:49:46 +0800 Subject: [PATCH] storagevol: add nocow to vol xml Add 'nocow' to storage volume xml so that user can have an option to set NOCOW flag to the newly created volume. It's useful on btrfs file system to enhance performance. Btrfs has low 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. Generally, there are two ways to turn off COW on btrfs: a) by mounting fs with nodatacow, then all newly created files will be NOCOW. b) per file. Add the NOCOW file attribute. It could only be done to empty or new files. This patch tries the second way, according to 'nocow' option, it could set NOCOW flag per file: for raw file images, handle 'nocow' in libvirt code; for non-raw file images, pass 'nocow=on' option to qemu-img, and let qemu-img to handle that (requires qemu-img version >= 2.1). Signed-off-by: Chunyan Liu <cyliu@suse.com> --- docs/formatstorage.html.in | 7 +++++++ docs/schemas/storagevol.rng | 5 +++++ src/conf/storage_conf.c | 3 +++ src/storage/storage_backend.c | 22 ++++++++++++++++++++++ src/util/virstoragefile.h | 1 + 5 files changed, 38 insertions(+) Index: libvirt-1.2.5/docs/formatstorage.html.in =================================================================== --- libvirt-1.2.5.orig/docs/formatstorage.html.in +++ libvirt-1.2.5/docs/formatstorage.html.in @@ -385,6 +385,7 @@ <label>virt_image_t</label> </permissions> <compat>1.1</compat> + <nocow/> <features> <lazy_refcounts/> </features> @@ -424,6 +425,12 @@ 1.1 is used. If omitted, qemu-img default is used. <span class="since">Since 1.1.0</span> </dd> + <dt><code>nocow</code></dt> + <dd>Turn off COW of the newly created volume. So far, this is only valid + for a file image in btrfs file system. It will improve performance when + the file image is used in VM. To create non-raw file images, it + requires QEMU version since 2.1. <span class="since">Since 1.2.7</span> + </dd> <dt><code>features</code></dt> <dd>Format-specific features. Only used for <code>qcow2</code> now. Valid sub-elements are: Index: libvirt-1.2.5/docs/schemas/storagevol.rng =================================================================== --- libvirt-1.2.5.orig/docs/schemas/storagevol.rng +++ libvirt-1.2.5/docs/schemas/storagevol.rng @@ -138,6 +138,11 @@ <ref name='compat'/> </optional> <optional> + <element name='nocow'> + <empty/> + </element> + </optional> + <optional> <ref name='fileFormatFeatures'/> </optional> </interleave> Index: libvirt-1.2.5/src/conf/storage_conf.c =================================================================== --- libvirt-1.2.5.orig/src/conf/storage_conf.c +++ libvirt-1.2.5/src/conf/storage_conf.c @@ -1395,6 +1395,9 @@ virStorageVolDefParseXML(virStoragePoolD virStringFreeList(version); } + if (virXPathNode("./target/nocow", ctxt)) + ret->target.nocow = true; + if (options->featureFromString && virXPathNode("./target/features", ctxt)) { if ((n = virXPathNodeSet("./target/features/*", ctxt, &nodes)) < 0) goto error; Index: libvirt-1.2.5/src/storage/storage_backend.c =================================================================== --- libvirt-1.2.5.orig/src/storage/storage_backend.c +++ libvirt-1.2.5/src/storage/storage_backend.c @@ -37,6 +37,9 @@ #ifdef __linux__ # include <sys/ioctl.h> # include <linux/fs.h> +# ifndef FS_NOCOW_FL +# define FS_NOCOW_FL 0x00800000 /* Do not cow file */ +# endif #endif #if WITH_SELINUX @@ -452,6 +455,21 @@ virStorageBackendCreateRaw(virConnectPtr goto cleanup; } + if (vol->target.nocow) { +#ifdef __linux__ + int attr; + + /* Set NOCOW flag. This is an optimisation for btrfs. + * The FS_IOC_SETFLAGS ioctl return value will be ignored since any + * failure of this operation should not block the left work. + */ + if (ioctl(fd, FS_IOC_GETFLAGS, &attr) == 0) { + attr |= FS_NOCOW_FL; + ioctl(fd, FS_IOC_SETFLAGS, &attr); + } +#endif + } + if ((ret = createRawFile(fd, vol, inputvol)) < 0) /* createRawFile already reported the exact error. */ ret = -1; @@ -717,6 +735,7 @@ virStorageBackendCreateQemuImgOpts(char bool preallocate, int format, const char *compat, + bool nocow, virBitmapPtr features) { virBuffer buf = VIR_BUFFER_INITIALIZER; @@ -729,6 +748,8 @@ virStorageBackendCreateQemuImgOpts(char virBufferAddLit(&buf, "encryption=on,"); if (preallocate) virBufferAddLit(&buf, "preallocation=metadata,"); + if (nocow) + virBufferAddLit(&buf, "nocow=on,"); if (compat) virBufferAsprintf(&buf, "compat=%s,", compat); @@ -950,6 +971,7 @@ virStorageBackendCreateQemuImgCmd(virCon do_encryption, preallocate, vol->target.format, compat, + vol->target.nocow, vol->target.features) < 0) { virCommandFree(cmd); return NULL; Index: libvirt-1.2.5/src/util/virstoragefile.h =================================================================== --- libvirt-1.2.5.orig/src/util/virstoragefile.h +++ libvirt-1.2.5/src/util/virstoragefile.h @@ -232,6 +232,7 @@ struct _virStorageSource { * pool-specific enum for storage volumes */ virBitmapPtr features; char *compat; + bool nocow; virStoragePermsPtr perms; virStorageTimestampsPtr timestamps;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor