open.2: Describe race of direct read and fork() for unaligned buffers

This is a long standing problem (or a surprising feature) in our
implementation of get_user_pages() (used by direct IO). Since
several attempts to fix it failed (e.g.,
http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg06542.html,
or http://lkml.indiana.edu/hypermail/linux/kernel/0903.1/01498.html
refused in http://comments.gmane.org/gmane.linux.kernel.mm/31569)
and it's not completely clear whether we really want to fix
it given the costs. Let's at least document it.

Signed-off-by: Jan Kara <jack@suse.cz>
Acked-by: Jeff Moyer <jmoyer@redhat.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Jan Kara 2012-05-01 17:51:47 +12:00 committed by Michael Kerrisk
parent 9a830e6211
commit 04cd7f643d
1 changed files with 8 additions and 3 deletions

View File

@ -49,7 +49,7 @@
.\" FIXME Linux 2.6.33 has O_DSYNC, and a hidden __O_SYNC.
.\" FIXME: Linux 2.6.39 added O_PATH
.\"
.TH OPEN 2 2012-02-27 "Linux" "Linux Programmer's Manual"
.TH OPEN 2 2012-05-01 "Linux" "Linux Programmer's Manual"
.SH NAME
open, creat \- open and possibly create a file or device
.SH SYNOPSIS
@ -768,8 +768,13 @@ operation in
Under Linux 2.4, transfer sizes, and the alignment of the user buffer
and the file offset must all be multiples of the logical block size
of the file system.
Under Linux 2.6, alignment to 512-byte boundaries
suffices.
Under Linux 2.6, alignment to 512-byte boundaries suffices.
However, if the user buffer is not page-aligned and the direct read
runs in parallel with a
.BR fork (2)
of the reader process, it may happen that the read data is split between
pages owned by the original process and its child.
Thus the read data is effectively corrupted.
.LP
The
.B O_DIRECT