)
};
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
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)?;