Revision 4ceb5db9757aaeadcf8fbbf97d76bd42aa4df0d6 authored by Linus Torvalds on 01 August 2005, 18:14:49 UTC, committed by Linus Torvalds on 01 August 2005, 18:14:49 UTC
There's no real guarantee that handle_mm_fault() will always be able to
break a COW situation - if an update from another thread ends up
modifying the page table some way, handle_mm_fault() may end up
requiring us to re-try the operation.

That's normally fine, but get_user_pages() ended up re-trying it as a
read, and thus a write access could in theory end up losing the dirty
bit or be done on a page that had not been properly COW'ed.

This makes get_user_pages() always retry write accesses as write
accesses by making "follow_page()" require that a writable follow has
the dirty bit set.  That simplifies the code and solves the race: if the
COW break fails for some reason, we'll just loop around and try again.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
1 parent 8d894c4
History
File Mode Size
basic
genksyms
kconfig
ksymoops
lxdialog
mod
package
Lindent -rwxr-xr-x 60 bytes
Makefile -rw-r--r-- 801 bytes
Makefile.build -rw-r--r-- 9.8 KB
Makefile.clean -rw-r--r-- 2.9 KB
Makefile.host -rw-r--r-- 5.8 KB
Makefile.lib -rw-r--r-- 9.9 KB
Makefile.modinst -rw-r--r-- 825 bytes
Makefile.modpost -rw-r--r-- 3.4 KB
bin2c.c -rw-r--r-- 702 bytes
binoffset.c -rw-r--r-- 3.9 KB
checkconfig.pl -rwxr-xr-x 1.7 KB
checkincludes.pl -rwxr-xr-x 529 bytes
checkstack.pl -rw-r--r-- 3.5 KB
checkversion.pl -rwxr-xr-x 1.9 KB
conmakehash.c -rw-r--r-- 6.0 KB
extract-ikconfig -rwxr-xr-x 1.6 KB
gcc-version.sh -rw-r--r-- 338 bytes
gen_initramfs_list.sh -rw-r--r-- 4.7 KB
kallsyms.c -rw-r--r-- 17.7 KB
kernel-doc -rwxr-xr-x 49.7 KB
makelst -rwxr-xr-x 941 bytes
mkcompile_h -rwxr-xr-x 2.1 KB
mkmakefile -rw-r--r-- 563 bytes
mksysmap -rw-r--r-- 1.3 KB
mkuboot.sh -rwxr-xr-x 293 bytes
mkversion -rw-r--r-- 74 bytes
namespace.pl -rw-r--r-- 13.1 KB
patch-kernel -rwxr-xr-x 9.7 KB
pnmtologo.c -rw-r--r-- 11.7 KB
reference_discarded.pl -rw-r--r-- 3.2 KB
reference_init.pl -rw-r--r-- 3.3 KB
show_delta -rw-r--r-- 3.0 KB
ver_linux -rwxr-xr-x 3.0 KB

back to top