parent
63cd4a39ea
commit
2c3eff99f0
@ -890,8 +890,11 @@ unsafe fn copy_file_range(
|
||||
)
|
||||
};
|
||||
if let Err(ref copy_err) = copy_result {
|
||||
if let Some(libc::ENOSYS) = copy_err.raw_os_error() {
|
||||
HAS_COPY_FILE_RANGE.store(false, Ordering::Relaxed);
|
||||
match copy_err.raw_os_error() {
|
||||
Some(libc::ENOSYS) | Some(libc::EPERM) => {
|
||||
HAS_COPY_FILE_RANGE.store(false, Ordering::Relaxed);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
copy_result
|
||||
@ -902,9 +905,13 @@ unsafe fn copy_file_range(
|
||||
Ok(ret) => written += ret as u64,
|
||||
Err(err) => {
|
||||
match err.raw_os_error() {
|
||||
Some(os_err) if os_err == libc::ENOSYS || os_err == libc::EXDEV => {
|
||||
// Either kernel is too old or the files are not mounted on the same fs.
|
||||
// Try again with fallback method
|
||||
Some(os_err) if os_err == libc::ENOSYS
|
||||
|| os_err == libc::EXDEV
|
||||
|| os_err == libc::EPERM => {
|
||||
// Try fallback io::copy if either:
|
||||
// - Kernel version is < 4.5 (ENOSYS)
|
||||
// - Files are mounted on different fs (EXDEV)
|
||||
// - copy_file_range is disallowed, for example by seccomp (EPERM)
|
||||
assert_eq!(written, 0);
|
||||
let ret = io::copy(&mut reader, &mut writer)?;
|
||||
writer.set_permissions(perm)?;
|
||||
|
Loading…
Reference in New Issue
Block a user