Voltar à lista
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âmetroTipoDescrição
fd_inintDescritor de origem.
off_inloff_t *Deslocamento em `fd_in`; NULL usa e atualiza a posição do arquivo.
fd_outintDescritor de destino.
off_outloff_t *Deslocamento em `fd_out`; NULL usa e atualiza a posição do arquivo.
lensize_tNúmero máximo de bytes a copiar.
flagsunsigned intReservado; deve ser 0.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1fd_inint
rsiargumento 2off_inloff_t *
rdxargumento 3fd_outint
r10argumento 4off_outloff_t *
r8argumento 5lensize_t
r9argumento 6flagsunsigned 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.

Relacionadas