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(a)gmail.com>
---
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