[libvirt] [PATCHv2 1/2] storage: introduce btrfsCloneFile() for COW copy

Chen, Hanxiao chenhanxiao at cn.fujitsu.com
Wed Jan 28 08:49:38 UTC 2015



> -----Original Message-----
> From: Ján Tomko [mailto:jtomko at redhat.com]
> Sent: Tuesday, January 27, 2015 8:46 PM
> To: Chen, Hanxiao/陈 晗霄; libvir-list at redhat.com
> Subject: Re: [libvirt] [PATCHv2 1/2] storage: introduce btrfsCloneFile() for COW
> copy
> 
> On 01/23/2015 11:22 AM, Chen Hanxiao wrote:
> > Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> > ---
> >  configure.ac                  | 12 ++++++++++++
> >  src/storage/storage_backend.c | 24 ++++++++++++++++++++++++
> >  2 files changed, 36 insertions(+)
> >
> > diff --git a/configure.ac b/configure.ac
> > index f370475..2498389 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -2175,6 +2175,18 @@ fi
> >  AM_CONDITIONAL([WITH_HYPERV], [test "$with_hyperv" = "yes"])
> >
> >
> > +dnl
> > +dnl check for kernel headers required by btrfs ioctl
> > +dnl
> > +if test "$with_linux" = "yes"; then
> 
> > +    have_btrfs=no
> > +    AC_CHECK_HEADER([linux/btrfs.h],[have_btrfs=yes])
> > +    if test "${have_btrfs}" = yes; then
> > +        AC_DEFINE([HAVE_BTRFS_IOC_CLONE], 1,
> > +                  [whether have btrfs CoW clone ioctl])
> 
> This macro name is misleading (it does not check for clone, just for btrfs.h).
> 
> Doing just:
> AC_CHECK_HEADERS([linux/btrfs.h])
> will define HAVE_LINUX_BTRFS_H
> 
> > +    fi
> > +fi
> > +
> >  dnl Allow perl/python overrides
> >  AC_PATH_PROGS([PYTHON], [python2 python])
> >  AC_PATH_PROG([PERL], [perl])
> > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> > index b990a82..d2a664b 100644
> > --- a/src/storage/storage_backend.c
> > +++ b/src/storage/storage_backend.c
> > @@ -46,6 +46,10 @@
> >  # include <selinux/selinux.h>
> >  #endif
> >
> > +#if HAVE_BTRFS_IOC_CLONE
> > +# include <linux/btrfs.h>
> > +#endif
> > +
> >  #include "datatypes.h"
> >  #include "virerror.h"
> >  #include "viralloc.h"
> > @@ -156,6 +160,26 @@ enum {
> >  #define READ_BLOCK_SIZE_DEFAULT  (1024 * 1024)
> >  #define WRITE_BLOCK_SIZE_DEFAULT (4 * 1024)
> >
> > +/*
> > + * Perform the O(1) btrfs clone operation, if possible.
> > + * Upon success, return 0.  Otherwise, return -1 and set errno.
> > + */
> > +#if defined(HAVE_BTRFS_IOC_CLONE)
> 
> #if HAVE_LINUX_BTRFS_H
> 
> > +static inline int
> > +btrfsCloneFile(int dest_fd, int src_fd)
> > +{
> > +    return ioctl(dest_fd, BTRFS_IOC_CLONE, src_fd);
> > +}
> > +#else
> > +static inline int
> > +btrfsCloneFile(int dest_fd ATTRIBUTE_UNUSED,
> > +               int src_fd ATTRIBUTE_UNUSED)
> > +{
> > +    errno = ENOTSUP;
> > +    return -1;
> > +}
> > +#endif
> > +
> >  static int ATTRIBUTE_NONNULL(2)
> >  virStorageBackendCopyToFD(virStorageVolDefPtr vol,
> >                            virStorageVolDefPtr inputvol,
> >
> 
> ACK
> 
> I simplified the configure check and pushed the patch.
> 

Thanks for your kindly help.

Regards,
- Chen





More information about the libvir-list mailing list