copy: drop COPY_REFLINK
Reflinking is a safe optimization whenever the source and destination are regular, seekable files on a filesystem that supports cloning. Requiring each caller to opt in through COPY_REFLINK adds flag plumbing without changing the necessary fallback behavior. Drop COPY_REFLINK, renumber the remaining flags, and have copy_bytes_full() unconditionally try FICLONE or FICLONERANGE before entering its normal copy loop. Isolate the clone attempt and its file-offset bookkeeping in a helper so copy_bytes_full() only has to handle its cloned, unavailable, and error results. A successful clone therefore completes in one operation, while an unsupported or rejected clone falls back to progress-limited copy_file_range(), sendfile(), or buffered copying. Keep the public reflink helpers for operations that specifically require clone semantics. Existing test-copy coverage exercises both bounded and unbounded regular-file copies through copy_bytes_full(). Signed-off-by: Daan De Meyer <daan@amutable.com>
This commit is contained in:
committed by
Zbigniew Jędrzejewski-Szmek
parent
28b1e4ea16
commit
5a12005c83
@@ -523,7 +523,7 @@ static int copy_file_with_version_check(
|
||||
* might be left at the end of the file. (Resetting before rather than after a copy attempt is safer
|
||||
* because a previous attempt might have failed half-way, leaving the file offset at some undefined
|
||||
* place.) */
|
||||
r = copy_bytes(source_fd, write_fd, UINT64_MAX, COPY_REFLINK|COPY_SEEK0_SOURCE);
|
||||
r = copy_bytes(source_fd, write_fd, UINT64_MAX, COPY_SEEK0_SOURCE);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to copy data from \"%s\" to \"%s\": %m", source_path, dest_path);
|
||||
|
||||
|
||||
@@ -453,7 +453,7 @@ static int begin_copy_file(
|
||||
CLEANUP_TMPFILE_AT(target_dir_fd, t);
|
||||
|
||||
if (source_fd >= 0) {
|
||||
r = copy_bytes(source_fd, write_fd, UINT64_MAX, COPY_REFLINK|COPY_SEEK0_SOURCE);
|
||||
r = copy_bytes(source_fd, write_fd, UINT64_MAX, COPY_SEEK0_SOURCE);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to copy data into '%s': %m", filename);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user