]) # LC_GLIBC_SUPPORT_FHANDLES
#
+# LC_GLIBC_SUPPORT_COPY_FILE_RANGE
+#
+AC_DEFUN([LC_GLIBC_SUPPORT_COPY_FILE_RANGE], [
+AC_CHECK_FUNCS([copy_file_range],
+ [AC_DEFINE(HAVE_COPY_FILE_RANGE, 1,
+ [copy_file_range() is supported])],
+ [AC_MSG_WARN([copy_file_range() is not supported])])
+]) # LC_GLIBC_SUPPORT_COPY_FILE_RANGE
+
+#
# LC_STACK_SIZE
#
# Ensure the stack size is at least 8k in Lustre server (all kernels)
LC_CONFIG_GSS
LC_GLIBC_SUPPORT_FHANDLES
+ LC_GLIBC_SUPPORT_COPY_FILE_RANGE
LC_OPENSSL_SSK
LC_OPENSSL_GETSEPOL
#define LL_MAXQUOTAS 3
#endif
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(a) ((sizeof(a)) / (sizeof((a)[0])))
-#endif
-
#define lustre_fid struct lu_fid
/* Currently external applications can access this but in the
#include <libcfs/util/string.h>
#include <linux/lustre/lustre_fid.h>
#include <lustre/lustreapi.h>
+#include "lstddef.h"
/* Progress reporting period */
#define REPORT_INTERVAL_DEFAULT 30
int chunk = (length - write_total > opt.o_chunk_size) ?
opt.o_chunk_size : length - write_total;
+ /* Try the accelerated copy path first. Once LU-10180 lands
+ * we should deal with holes.
+ */
+ wsize = copy_file_range(src_fd, NULL, dst_fd, NULL,
+ chunk, 0);
+ if (wsize != -1)
+ goto fini_fastcopy;
+ rc = -errno;
+ /* Before Linux kernel 5.3 copy_file_range only supported
+ * file copies between filesystems of the same type. In
+ * that case copy_file_range() will return -EXDEV.
+ */
+ if (rc != -EXDEV && rc != -ENOSYS) {
+ CT_ERROR(rc, "copy_file_range failed for '%s' to '%s'",
+ src, dst);
+ break;
+ }
+
+ /* copy_file_range is not avalible or failed
+ * so use what works.
+ */
rsize = pread(src_fd, buf, chunk, offset);
if (rsize == 0)
/* EOF */
CT_ERROR(rc, "cannot write to '%s'", dst);
break;
}
-
+fini_fastcopy:
write_total += wsize;
offset += wsize;
#include <linux/lustre/lustre_ostid.h>
#include <linux/lustre/lustre_ioctl.h>
#include "lustreapi_internal.h"
+#include "lstddef.h"
static int llapi_msg_level = LLAPI_MSG_MAX;
const char *liblustreapi_cmd;
(type *)((char *)__mptr - offsetof(type, member)); \
})
+#ifndef HAVE_COPY_FILE_RANGE
+
+#ifndef __NR_copy_file_range
+
+#if defined(_ASM_X86_UNISTD_64_H)
+#define __NR_copy_file_range 326
+#elif defined(_ASM_X86_UNISTD_32_H)
+#define __NR_copy_file_range 285
+#else
+#define __NR_copy_file_range 285
+#endif
+
+#endif
+
+static inline loff_t copy_file_range(int fd_in, loff_t *off_in, int fd_out,
+ loff_t *off_out, size_t len,
+ unsigned int flags)
+{
+ return syscall(__NR_copy_file_range, fd_in, off_in, fd_out,
+ off_out, len, flags);
+}
+#endif /* !HAVE_COPY_FILE_RANGE */
+
#endif /* !_LSTDDEF_H */