storage: introduce btrfsCloneFile() for COW copy

Add a wrapper for BTRFS_IOC_CLONE ioctl.

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Chen Hanxiao 2015-01-23 18:22:34 +08:00 committed by Ján Tomko
parent 55ea7be7d9
commit 466b29c8c3
2 changed files with 31 additions and 0 deletions

View File

@ -2175,6 +2175,13 @@ fi
AM_CONDITIONAL([WITH_HYPERV], [test "$with_hyperv" = "yes"]) 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 dnl Allow perl/python overrides
AC_PATH_PROGS([PYTHON], [python2 python]) AC_PATH_PROGS([PYTHON], [python2 python])
AC_PATH_PROG([PERL], [perl]) AC_PATH_PROG([PERL], [perl])

View File

@ -46,6 +46,10 @@
# include <selinux/selinux.h> # include <selinux/selinux.h>
#endif #endif
#if HAVE_LINUX_BTRFS_H
# include <linux/btrfs.h>
#endif
#include "datatypes.h" #include "datatypes.h"
#include "virerror.h" #include "virerror.h"
#include "viralloc.h" #include "viralloc.h"
@ -156,6 +160,26 @@ enum {
#define READ_BLOCK_SIZE_DEFAULT (1024 * 1024) #define READ_BLOCK_SIZE_DEFAULT (1024 * 1024)
#define WRITE_BLOCK_SIZE_DEFAULT (4 * 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) static int ATTRIBUTE_NONNULL(2)
virStorageBackendCopyToFD(virStorageVolDefPtr vol, virStorageBackendCopyToFD(virStorageVolDefPtr vol,
virStorageVolDefPtr inputvol, virStorageVolDefPtr inputvol,