This commit renames and adds other macros to support aother filesystems when a reflink is performed. After that, XFS filesystems (and others) with reflink support will be able to clone. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1565004 Signed-off-by: Julio Faracco <jcfaracco@xxxxxxxxx> --- src/storage/storage_util.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index a701a75702..fd1239c6cb 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -36,6 +36,9 @@ # ifndef FS_NOCOW_FL # define FS_NOCOW_FL 0x00800000 /* Do not cow file */ # endif +# ifdef FICLONE +# define REFLINK_IOC_CLONE FICLONE +# endif #endif #if WITH_BLKID @@ -48,6 +51,10 @@ #if HAVE_LINUX_BTRFS_H # include <linux/btrfs.h> +# define REFLINK_IOC_CLONE BTRFS_IOC_CLONE +#elif HAVE_XFS_XFS_H +# include <xfs/xfs.h> +# define REFLINK_IOC_CLONE XFS_IOC_CLONE #endif #include "datatypes.h" @@ -80,22 +87,23 @@ VIR_LOG_INIT("storage.storage_util"); * Perform the O(1) btrfs clone operation, if possible. * Upon success, return 0. Otherwise, return -1 and set errno. */ -#if HAVE_LINUX_BTRFS_H +#ifdef REFLINK_IOC_CLONE static inline int -btrfsCloneFile(int dest_fd, int src_fd) +reflinkCloneFile(int dest_fd, int src_fd) { - return ioctl(dest_fd, BTRFS_IOC_CLONE, src_fd); + return ioctl(dest_fd, REFLINK_IOC_CLONE, src_fd); } #else static inline int -btrfsCloneFile(int dest_fd ATTRIBUTE_UNUSED, - int src_fd ATTRIBUTE_UNUSED) +reflinkCloneFile(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, @@ -142,7 +150,7 @@ virStorageBackendCopyToFD(virStorageVolDefPtr vol, } if (reflink_copy) { - if (btrfsCloneFile(fd, inputfd) < 0) { + if (reflinkCloneFile(fd, inputfd) < 0) { ret = -errno; virReportSystemError(errno, _("failed to clone files from '%s'"), -- 2.17.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list