
-----Original Message----- From: Jรกn Tomko [mailto:jtomko@redhat.com] Sent: Tuesday, January 27, 2015 8:46 PM To: Chen, Hanxiao/้ ๆ้; libvir-list@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@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