Linux x86_64Arquivos & E/S#326
copy_file_range
Copia dados diretamente entre dois arquivos dentro do kernel, potencialmente usando cópia do lado do servidor ou reflink.
Descrição
Em sistemas de arquivos que suportam (ex.: Btrfs, XFS com reflink, NFS >= 4.2 com cópia server-side), pode evitar completamente transferir os bytes pela rede/pelo kernel, criando referências compartilhadas aos mesmos blocos em disco (copy-on-write).
man 2Desde o kernel 4.5
Assinatura
ssize_t copy_file_range(
int fd_in,
loff_t * off_in,
int fd_out,
loff_t * off_out,
size_t len,
unsigned int flags
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| fd_in | int | Descritor de origem. |
| off_in | loff_t * | Deslocamento em `fd_in`; NULL usa e atualiza a posição do arquivo. |
| fd_out | int | Descritor de destino. |
| off_out | loff_t * | Deslocamento em `fd_out`; NULL usa e atualiza a posição do arquivo. |
| len | size_t | Número máximo de bytes a copiar. |
| flags | unsigned int | Reservado; deve ser 0. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | fd_inint |
| rsi | argumento 2 | off_inloff_t * |
| rdx | argumento 3 | fd_outint |
| r10 | argumento 4 | off_outloff_t * |
| r8 | argumento 5 | lensize_t |
| r9 | argumento 6 | flagsunsigned int |
Valor de retorno
Número de bytes copiados em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EBADF(9)
- Descritor de arquivo inválido.
- EINVAL(22)
- Argumento inválido.
- EISDIR(21)
- É um diretório (operação exige um arquivo comum).
- ENOSPC(28)
- Sem espaço livre no dispositivo.
- EXDEV(18)
- Link cruzando dispositivos/sistemas de arquivos diferentes.