mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-21 20:15:17 +00:00
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:
parent
55ea7be7d9
commit
466b29c8c3
@ -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])
|
||||
|
@ -46,6 +46,10 @@
|
||||
# include <selinux/selinux.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_LINUX_BTRFS_H
|
||||
# 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 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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user