]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-93180: Update os.copy_file_range() documentation (#93182)
authorIllia Volochii <illia.volochii@gmail.com>
Wed, 8 Jun 2022 15:49:13 +0000 (18:49 +0300)
committerGitHub <noreply@github.com>
Wed, 8 Jun 2022 15:49:13 +0000 (17:49 +0200)
Doc/library/os.rst

index d5e9bbcffc31cf74de46d692339774337211fd2b..87e9eb6b69c84ba338eb3c5fc2d02f0a3a3476e6 100644 (file)
@@ -798,18 +798,32 @@ 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 function copies bytes between two file descriptors. Text options, like
+   the encoding and the line ending, are ignored.
 
    The return value is the amount of bytes copied. This could be less than the
    amount requested.
 
+   .. note::
+
+      On Linux, :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