linux/include/asm-mips
Ralf Baechle e03b526932 [MIPS] Fixup copy_from_user_inatomic
From the 01408c4939 log message:

The problem is that when we write to a file, the copy from userspace to
pagecache is first done with preemption disabled, so if the source
address is not immediately available the copy fails *and* *zeros* *the*
*destination*.

This is a problem because a concurrent read (which admittedly is an odd
thing to do) might see zeros rather that was there before the write, or
what was there after, or some mixture of the two (any of these being a
reasonable thing to see).

If the copy did fail, it will immediately be retried with preemption
re-enabled so any transient problem with accessing the source won't
cause an error.

The first copying does not need to zero any uncopied bytes, and doing
so causes the problem.  It uses copy_from_user_atomic rather than
copy_from_user so the simple expedient is to change copy_from_user_atomic
to *not* zero out bytes on failure.

< --- end cite --- >

This patch finally implements at least a not so pretty solution by
duplicating the relevant part of __copy_user.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2007-02-20 01:26:42 +00:00
..
arc
ddb5xxx
dec
emma2rh
ip32
jmr3927
lasat
mach-atlas
mach-au1x00
mach-cobalt
mach-db1x00
mach-dec
mach-emma2rh
mach-ev64120
mach-excite
mach-generic
mach-ip22
mach-ip27
mach-ip32
mach-ja
mach-jazz
mach-jmr3927
mach-lasat
mach-mips
mach-ocelot
mach-ocelot3
mach-pb1x00
mach-pnx8550
mach-qemu
mach-rm
mach-sibyte
mach-sim
mach-vr41xx
mach-wrppmc
mach-yosemite
mips-boards
pci
sgi
sibyte
sn
tx4927
tx4938
vr41xx
xtalk
8253pit.h
a.out.h
abi.h
addrspace.h
asm.h
asmmacro-32.h
asmmacro-64.h
asmmacro.h
atomic.h
auxvec.h
barrier.h
bcache.h
bitops.h
bootinfo.h
branch.h
break.h
bug.h
bugs.h
byteorder.h
cache.h
cachectl.h
cacheflush.h
cacheops.h
checksum.h
compat-signal.h
compat.h
compiler.h
cpu-features.h
cpu-info.h
cpu.h
cputime.h
current.h
debug.h
delay.h
device.h
div64.h
dma-mapping.h
dma.h
ds1216.h
ds1286.h
ds1742.h
dsp.h
elf.h
emergency-restart.h
errno.h
fcntl.h
fixmap.h
floppy.h
fpregdef.h
fpu_emulator.h
fpu.h
futex.h
gdb-stub.h
gfx.h
gt64120.h
gt64240.h
hardirq.h
hazards.h
highmem.h
hw_irq.h
i8259.h
ide.h
inst.h
inventory.h
io.h
ioctl.h
ioctls.h
ipc.h
ipcbuf.h
irq_cpu.h
irq_regs.h
irq.h
irqflags.h
isadep.h
jazz.h
jazzdma.h
Kbuild
kexec.h
kmap_types.h
kspd.h
linkage.h
local.h
m48t35.h
m48t37.h
marvell.h
mc146818-time.h
mc146818rtc.h
mips_mt.h
mipsmtregs.h
mipsprom.h
mipsregs.h
mman.h
mmu_context.h
mmu.h
mmzone.h
module.h
msc01_ic.h
msgbuf.h
mutex.h
namei.h
nile4.h
paccess.h
page.h
param.h
parport.h
pci.h
percpu.h
pgalloc.h
pgtable-32.h
pgtable-64.h
pgtable-bits.h
pgtable.h
pmon.h
poll.h
posix_types.h
prctl.h
prefetch.h
processor.h
ptrace.h
qemu.h
r4kcache.h
reboot.h
reg.h
regdef.h
resource.h
rm9k-ocd.h
rtc.h
rtlx.h
scatterlist.h
sections.h
segment.h
semaphore.h
sembuf.h
serial.h
setup.h
sgialib.h
sgiarcs.h
sgidefs.h
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h
sim.h
smp.h
smtc_ipi.h
smtc_proc.h
smtc.h
sni.h
socket.h
sockios.h
sparsemem.h
spinlock_types.h
spinlock.h
stackframe.h
stacktrace.h
stat.h
statfs.h
string.h
suspend.h
sysmips.h
system.h
termbits.h
termios.h
thread_info.h
time.h
timex.h
titan_dep.h
tlb.h
tlbdebug.h
tlbflush.h
topology.h
traps.h
tx3912.h
types.h
uaccess.h
ucontext.h
unaligned.h
unistd.h
user.h
vga.h
vpe.h
war.h
watch.h
wbflush.h
xor.h
xxs1500.h