diff --git a/src/ioslaves/file/ConfigureChecks.cmake b/src/ioslaves/file/ConfigureChecks.cmake --- a/src/ioslaves/file/ConfigureChecks.cmake +++ b/src/ioslaves/file/ConfigureChecks.cmake @@ -7,6 +7,7 @@ check_include_files(sys/time.h HAVE_SYS_TIME_H) check_include_files(string.h HAVE_STRING_H) check_include_files(limits.h HAVE_LIMITS_H) +check_include_files(linux/fs.h HAVE_LINUX_FS_H) check_function_exists(sendfile HAVE_SENDFILE) check_function_exists(posix_fadvise HAVE_FADVISE) # kioslave diff --git a/src/ioslaves/file/config-kioslave-file.h.cmake b/src/ioslaves/file/config-kioslave-file.h.cmake --- a/src/ioslaves/file/config-kioslave-file.h.cmake +++ b/src/ioslaves/file/config-kioslave-file.h.cmake @@ -3,6 +3,7 @@ #cmakedefine01 HAVE_SYS_TIME_H #cmakedefine01 HAVE_STRING_H #cmakedefine01 HAVE_LIMITS_H +#cmakedefine01 HAVE_LINUX_FS_H /* Defined if system has POSIX ACL support. */ #cmakedefine01 HAVE_POSIX_ACL diff --git a/src/ioslaves/file/file_unix.cpp b/src/ioslaves/file/file_unix.cpp --- a/src/ioslaves/file/file_unix.cpp +++ b/src/ioslaves/file/file_unix.cpp @@ -43,6 +43,14 @@ #endif #include +#if HAVE_LINUX_FS_H +#include +#endif + +#if !defined FICLONE && defined Q_OS_LINUX +#define FICLONE _IOW(0x94, 9, int) //in linux/fs.h +#endif + #include #include @@ -249,13 +257,24 @@ #endif totalSize(buff_src.st_size); + bool clone_created = false; +#ifdef FICLONE + clone_created = ioctl(dest_file.handle(), FICLONE, src_file.handle()) != -1; + //qDebug() << "Clone created:" << clone_created;" +#endif + KIO::filesize_t processed_size = 0; char buffer[ MAX_IPC_SIZE ]; ssize_t n = 0; #ifdef USE_SENDFILE bool use_sendfile = buff_src.st_size < 0x7FFFFFFF; #endif while (1) { + if (clone_created) { + processedSize(buff_src.st_size); + break; + } + #ifdef USE_SENDFILE if (use_sendfile) { off_t sf = processed_size;