Index: bin/cp/utils.c =================================================================== --- bin/cp/utils.c +++ bin/cp/utils.c @@ -237,9 +237,48 @@ if (use_copy_file_range) { rcount = copy_file_range(from_fd, NULL, to_fd, NULL, SSIZE_MAX, 0); - if (rcount < 0 && errno == EINVAL) { + if (rcount < 0) { + switch (errno) { + case EINVAL: /* Prob a non-seekable FD */ - use_copy_file_range = 0; + /* fallthrough */ + case ENOSYS: + /* Earlier OS version */ + /* fallthrough */ + case EXDEV: + /* different devices */ + use_copy_file_range = 0; + break; + + case ENOSPC: + break; + case EDQUOT: + break; + case EFBIG: + break; + case EROFS: + break; + case EINTR: + break; + case EBUSY: + break; + case ENOBUFS: + break; + case ENOMEM: + break; + case EINTEGRITY: + break; + case EIO: + break; + case EBADF: + break; + case EISDIR: + break; + + /* fallback for safety */ + default: + use_copy_file_range = 0; + } } } if (!use_copy_file_range)