diff --git a/configure.ac b/configure.ac index ddbdba56c9..2c406520b7 100644 --- a/configure.ac +++ b/configure.ac @@ -2175,6 +2175,13 @@ 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 + AC_CHECK_HEADERS([linux/btrfs.h]) +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 b990a82957..841508e381 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -46,6 +46,10 @@ # include #endif +#if HAVE_LINUX_BTRFS_H +# include +#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 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,