From 466b29c8c3593b2dac92acad5dd8ec923c428259 Mon Sep 17 00:00:00 2001 From: Chen Hanxiao Date: Fri, 23 Jan 2015 18:22:34 +0800 Subject: [PATCH] storage: introduce btrfsCloneFile() for COW copy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a wrapper for BTRFS_IOC_CLONE ioctl. Signed-off-by: Chen Hanxiao Signed-off-by: Ján Tomko --- configure.ac | 7 +++++++ src/storage/storage_backend.c | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) 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,