[libvirt PATCH 1/4] util: add a helper method for controlling the COW flag on btrfs

Daniel P. Berrangé berrange at redhat.com
Thu Jul 23 13:00:40 UTC 2020


On Thu, Jul 23, 2020 at 02:57:32PM +0200, Peter Krempa wrote:
> On Mon, Jul 20, 2020 at 18:33:19 +0100, Daniel Berrange wrote:
> > btrfs defaults to performing copy-on-write for files. This is often
> > undesirable for VM images, so we need to be able to control whether this
> > behaviour is used.
> > 
> > The virFileSetCOW() will allow for this. We use a tristate, since out of
> > the box, we want the default behaviour attempt to disable cow, but only
> > on btrfs, silently do nothing on non-btrfs. If someone explicitly asks
> > to disable/enable cow, then we want to raise a hard error on non-btrfs.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> > ---
> >  src/libvirt_private.syms |  1 +
> >  src/util/virfile.c       | 76 ++++++++++++++++++++++++++++++++++++++++
> >  src/util/virfile.h       |  3 ++
> >  3 files changed, 80 insertions(+)
> > 
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index 73b72c9e10..eea31a736d 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -2125,6 +2125,7 @@ virFileRewrite;
> >  virFileRewriteStr;
> >  virFileSanitizePath;
> >  virFileSetACLs;
> > +virFileSetCOW;
> >  virFileSetupDev;
> >  virFileSetXAttr;
> >  virFileTouch;
> > diff --git a/src/util/virfile.c b/src/util/virfile.c
> > index 213acdbcaa..5b169b3d11 100644
> > --- a/src/util/virfile.c
> > +++ b/src/util/virfile.c
> > @@ -71,6 +71,7 @@
> >  # endif
> >  # include <sys/ioctl.h>
> >  # include <linux/cdrom.h>
> > +# include <linux/fs.h>
> >  #endif
> >  
> >  #if HAVE_LIBATTR
> > @@ -4504,3 +4505,78 @@ virFileDataSync(int fd)
> >      return fdatasync(fd);
> >  #endif
> >  }
> > +
> > +
> > +int
> > +virFileSetCOW(const char *path,
> > +              virTristateBool state)
> > +{
> > +#if __linux__
> > +    int val = 0;
> > +    struct statfs buf;
> > +    VIR_AUTOCLOSE fd = -1;
> > +
> > +    VIR_DEBUG("Setting COW flag on '%s' to '%s'",
> > +              path, virTristateBoolTypeToString(state));
> > +
> > +    fd = open(path, O_RDONLY|O_NONBLOCK|O_LARGEFILE);
> > +    if (fd < 0) {
> > +        virReportSystemError(errno, _("unable to open '%s'"),
> > +                             path);
> > +        return -1;
> > +    }
> > +
> > +    if (fstatfs(fd, &buf) < 0)  {
> > +        virReportSystemError(errno, _("unable query filesystem type on '%s'"),
> > +                             path);
> > +        return -1;
> > +    }
> > +
> > +    if (buf.f_type != BTRFS_SUPER_MAGIC) {
> > +        if (state == VIR_TRISTATE_BOOL_ABSENT) {
> 
> Can't we handle the _ABSENT case before even attempting to open the
> file?

This would require us to use statfs() instad of fstatfs() in order to
check the super magic. I'm not seeing that improves things.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list