Skip to content
21 changes: 18 additions & 3 deletions Doc/library/os.rst
Original file line number Diff line number Diff line change
Expand Up @@ -798,18 +798,33 @@ as internal buffering of data.
Copy *count* bytes from file descriptor *src*, starting from offset
*offset_src*, to file descriptor *dst*, starting from offset *offset_dst*.
If *offset_src* is None, then *src* is read from the current position;
respectively for *offset_dst*. The files pointed by *src* and *dst*
respectively for *offset_dst*.

In Linux kernel older than 5.3, the files pointed by *src* and *dst*
must reside in the same filesystem, otherwise an :exc:`OSError` is
raised with :attr:`~OSError.errno` set to :data:`errno.EXDEV`.

This copy is done without the additional cost of transferring data
from the kernel to user space and then back into the kernel. Additionally,
some filesystems could implement extra optimizations. The copy is done as if
both files are opened as binary.
some filesystems could implement extra optimizations, such as the use of
reflinks (i.e., two or more inodes that share pointers to the same
copy-on-write disk blocks; supported file systems include btrfs and XFS)
and server-side copy (in the case of NFS).

The copy is done as if both files are opened in binary mode, meaning that
this function will not convert encodings or line endings even if you have
opened the files in text mode for that as described in :ref:`tut-files`.

The return value is the amount of bytes copied. This could be less than the
amount requested.

.. note::

:func:`os.copy_file_range` should not be used for copying a range of a
pseudo file from a special filesystem like procfs and sysfs. It will
always copy no bytes and return 0 as if the file was empty because of a
known Linux kernel issue.

.. availability:: Linux kernel >= 4.5 or glibc >= 2.27.

.. versionadded:: 3.8
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update documentation of :func:`os.copy_file_range`. Patch by Illia Volochii.