On 01/23/2015 11:22 AM, Chen Hanxiao wrote: > Signed-off-by: Chen Hanxiao <chenhanxiao@xxxxxxxxxxxxxx> > --- > 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. Jan
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list