android_kernel_samsung_univ.../include/linux
Peter Staubach c293621bbf [PATCH] stale POSIX lock handling
I believe that there is a problem with the handling of POSIX locks, which
the attached patch should address.

The problem appears to be a race between fcntl(2) and close(2).  A
multithreaded application could close a file descriptor at the same time as
it is trying to acquire a lock using the same file descriptor.  I would
suggest that that multithreaded application is not providing the proper
synchronization for itself, but the OS should still behave correctly.

SUS3 (Single UNIX Specification Version 3, read: POSIX) indicates that when
a file descriptor is closed, that all POSIX locks on the file, owned by the
process which closed the file descriptor, should be released.

The trick here is when those locks are released.  The current code releases
all locks which exist when close is processing, but any locks in progress
are handled when the last reference to the open file is released.

There are three cases to consider.

One is the simple case, a multithreaded (mt) process has a file open and
races to close it and acquire a lock on it.  In this case, the close will
release one reference to the open file and when the fcntl is done, it will
release the other reference.  For this situation, no locks should exist on
the file when both the close and fcntl operations are done.  The current
system will handle this case because the last reference to the open file is
being released.

The second case is when the mt process has dup(2)'d the file descriptor.
The close will release one reference to the file and the fcntl, when done,
will release another, but there will still be at least one more reference
to the open file.  One could argue that the existence of a lock on the file
after the close has completed is okay, because it was acquired after the
close operation and there is still a way for the application to release the
lock on the file, using an existing file descriptor.

The third case is when the mt process has forked, after opening the file
and either before or after becoming an mt process.  In this case, each
process would hold a reference to the open file.  For each process, this
degenerates to first case above.  However, the lock continues to exist
until both processes have released their references to the open file.  This
lock could block other lock requests.

The changes to release the lock when the last reference to the open file
aren't quite right because they would allow the lock to exist as long as
there was a reference to the open file.  This is too long.

The new proposed solution is to add support in the fcntl code path to
detect a race with close and then to release the lock which was just
acquired when such as race is detected.  This causes locks to be released
in a timely fashion and for the system to conform to the POSIX semantic
specification.

This was tested by instrumenting a kernel to detect the handling locks and
then running a program which generates case #3 above.  A dangling lock
could be reliably generated.  When the changes to detect the close/fcntl
race were added, a dangling lock could no longer be generated.

Cc: Matthew Wilcox <willy@debian.org>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-07-27 16:26:06 -07:00
..
byteorder [PATCH] swabb.h warning fixes 2005-06-28 21:20:31 -07:00
dvb
hdlc
isdn
lockd
mmc
mtd [MTD] XIP cleanup 2005-07-07 16:50:16 +02:00
netfilter_arp
netfilter_bridge
netfilter_ipv4 [NETFILTER]: Fix ip_conntrack_put() prototype. 2005-07-26 15:39:28 -07:00
netfilter_ipv6
nfsd [PATCH] nfsd4: check lock type against openmode. 2005-07-07 18:24:11 -07:00
raid [PATCH] md/raid1: clear bitmap when fullsync completes 2005-07-15 09:54:51 -07:00
sunrpc
tc_act
tc_ematch [PKT_SCHED]: em_meta: Kill TCF_META_ID_{INDEV,SECURITY,TCVERDICT} 2005-07-22 14:43:52 -07:00
8250_pci.h
a.out.h [PATCH] Use ALIGN to remove duplicate code 2005-06-25 16:25:02 -07:00
ac97_codec.h
acct.h
acpi.h [ACPI] merge acpi-2.6.12 branch into latest Linux 2.6.13-rc... 2005-07-12 17:21:56 -04:00
adb.h
adfs_fs_i.h
adfs_fs_sb.h
adfs_fs.h
affs_fs.h
affs_hardblocks.h
agp_backend.h
agpgart.h
aio_abi.h
aio.h
amifd.h
amifdreg.h
amigaffs.h
apm_bios.h
arcdevice.h
arcfb.h
ata.h
atalk.h [ATALK]: Include asm/byteorder.h in linux/atalk.h 2005-06-26 15:28:10 -07:00
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_suni.h
atm_tcp.h
atm_zatm.h
atm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
attribute_container.h
audit.h [SPARC64]: Add syscall auditing support. 2005-07-10 19:29:45 -07:00
auto_fs4.h
auto_fs.h
awe_voice.h
ax25.h
b1lli.h
b1pcmcia.h
backing-dev.h
backlight.h
baycom.h
bcd.h
bfs_fs.h
binfmts.h
bio.h [PATCH] Update cfq io scheduler to time sliced design 2005-06-27 14:33:29 -07:00
bitmap.h
bitops.h
blkdev.h [PATCH] blk: light iocontext ops 2005-06-28 21:20:35 -07:00
blkpg.h
blockgroup_lock.h
bootmem.h [PATCH] kdump: Retrieve saved max pfn 2005-06-25 16:24:52 -07:00
bpqether.h
buffer_head.h [PATCH] page_uptodate locking scalability 2005-07-07 18:23:45 -07:00
cache.h [SPARC64]: Add __read_mostly support. 2005-07-10 15:45:11 -07:00
capability.h
capi.h
cciss_ioctl.h [PATCH] cciss: pci domain info pass 2 2005-06-27 15:11:48 -07:00
cd1400.h
cdev.h
cdk.h
cdrom.h
chio.h
circ_buf.h
cobalt-nvram.h
coda_cache.h
coda_fs_i.h
coda_linux.h
coda_proc.h
coda_psdev.h
coda.h
coff.h
com20020.h
compat_ioctl.h [SPARC64/COMPAT]: Add some compat ioctl for ppdev 2005-07-04 13:23:45 -07:00
compat.h
compiler-gcc2.h
compiler-gcc3.h
compiler-gcc4.h
compiler-gcc.h
compiler-intel.h
compiler.h
completion.h
comstats.h
concap.h
config.h
console_struct.h
console.h
consolemap.h
cpu.h [PATCH] make smp_prepare_cpu to a weak function 2005-06-25 16:24:30 -07:00
cpufreq.h [PATCH] pm: fix u32 vs. pm_message_t confusion in cpufreq 2005-07-07 18:23:43 -07:00
cpumask.h
cpuset.h
cramfs_fs_sb.h
cramfs_fs.h
crash_dump.h [PATCH] kdump: Access dump file in elf format (/proc/vmcore) 2005-06-25 16:24:53 -07:00
crc32.h
crc32c.h
crc-ccitt.h
crypto.h [CRYPTO] Ensure cit_iv is aligned correctly 2005-07-06 13:53:29 -07:00
cryptohash.h
ctype.h
cuda.h
cyclades.h
cyclomx.h
cycx_cfm.h
cycx_drv.h
cycx_x25.h
dcache.h
dcookies.h
debugfs.h
delay.h
devfs_fs_kernel.h
devfs_fs.h
device-mapper.h
device.h [ACPI] merge acpi-2.6.12 branch into latest Linux 2.6.13-rc... 2005-07-12 17:21:56 -04:00
devpts_fs.h
dio.h
dirent.h
divert.h
dm9000.h
dm-ioctl.h
dma-mapping.h
dmapool.h
dmi.h [PATCH] I8K: use standard DMI interface 2005-06-25 16:24:24 -07:00
dn.h
dnotify.h
dqblk_v1.h
dqblk_v2.h
dqblk_xfs.h
ds1286.h
dtlk.h
edd.h
eeprom.h
efi.h
efs_dir.h
efs_fs_i.h
efs_fs_sb.h
efs_fs.h
efs_vh.h
eisa.h
elevator.h [PATCH] Update cfq io scheduler to time sliced design 2005-06-27 14:33:29 -07:00
elf-fdpic.h
elf.h
elfcore.h
err.h
errno.h
errqueue.h
etherdevice.h [NET]: __be'ify *_type_trans() 2005-07-12 12:08:43 -07:00
ethtool.h
eventpoll.h
ext2_fs_sb.h
ext2_fs.h [PATCH] xip: ext2: execute in place 2005-06-24 00:06:41 -07:00
ext3_fs_i.h
ext3_fs_sb.h
ext3_fs.h [PATCH] ext3: fix options parsing 2005-07-12 16:01:01 -07:00
ext3_jbd.h
fadvise.h [PATCH] s390: fadvise hint values. 2005-07-13 11:25:24 -07:00
fb.h
fcdevice.h
fcntl.h
fd1772.h
fd.h
fddidevice.h [NET]: __be'ify *_type_trans() 2005-07-12 12:08:43 -07:00
fdreg.h
file.h
filter.h
firmware.h
flat.h
font.h
fs_struct.h
fs.h [PATCH] stale POSIX lock handling 2005-07-27 16:26:06 -07:00
fsl_devices.h
fsnotify.h [PATCH] inotify: event ordering 2005-07-13 11:09:31 -07:00
ftape-header-segment.h
ftape-vendors.h
ftape.h
futex.h
gameport.h
gen_stats.h
genalloc.h
generic_serial.h
genhd.h
gfp.h [PATCH] propagate __nocast annotations 2005-07-07 18:23:46 -07:00
hardirq.h [PATCH] hardirq uses preempt 2005-07-12 16:01:03 -07:00
harrier_defs.h
hash.h
hayesesp.h
hdlc.h [NET]: __be'ify *_type_trans() 2005-07-12 12:08:43 -07:00
hdlcdrv.h
hdpu_features.h
hdreg.h
hdsmart.h
hiddev.h
highmem.h [PATCH] kdump: Routines for copying dump pages 2005-06-25 16:24:53 -07:00
highuid.h
hippidevice.h
hpet.h
hpfs_fs.h
hugetlb.h
hwmon-sysfs.h
hysdn_if.h
i2c-algo-bit.h
i2c-algo-ite.h
i2c-algo-pca.h
i2c-algo-pcf.h
i2c-algo-sgi.h
i2c-algo-sibyte.h
i2c-dev.h [PATCH] headers: include linux/compiler.h for __user 2005-06-28 21:20:32 -07:00
i2c-id.h
i2c-sensor.h
i2c-vid.h
i2c.h
i2o-dev.h [PATCH] I2O: second code cleanup of sparse warnings and unneeded syncronization 2005-06-24 00:05:29 -07:00
i2o.h [PATCH] I2O: Lindent run and replacement of printk through osm printing functions 2005-06-24 00:05:29 -07:00
i8k.h
ibmtr.h
icmp.h
icmpv6.h
ide.h
idr.h
if_arcnet.h
if_arp.h
if_bonding.h bonding: xor/802.3ad improved slave hash 2005-06-26 17:54:11 -04:00
if_bridge.h
if_cablemodem.h
if_ec.h
if_eql.h
if_ether.h
if_fc.h
if_fddi.h
if_frad.h
if_hippi.h
if_infiniband.h
if_ltalk.h
if_packet.h
if_plip.h
if_ppp.h
if_pppox.h
if_shaper.h [SHAPER]: Switch to spinlocks. 2005-07-05 15:03:46 -07:00
if_slip.h
if_strip.h
if_tr.h
if_tun.h
if_tunnel.h
if_vlan.h
if_wanpipe_common.h
if_wanpipe.h
if.h
igmp.h [IPV4]: multicast API "join" issues 2005-07-08 17:38:07 -07:00
in6.h [IPV6]: remove more unused IPV6_AUTHHDR things. 2005-06-28 15:46:24 -07:00
in_route.h
in.h
inet.h
inetdevice.h
init_task.h [PATCH] Update cfq io scheduler to time sliced design 2005-06-27 14:33:29 -07:00
init.h [PATCH] x86_64: Change init sections for CPU hotplug support 2005-06-25 16:24:30 -07:00
initrd.h
inotify.h [PATCH] inotify 2005-07-12 20:38:38 -07:00
input.h Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/dtor/input.git manually 2005-06-27 14:47:31 -07:00
interrupt.h
ioc4.h
ioctl32.h
ioctl.h
ioport.h
ioprio.h [PATCH] move ioprio syscalls into syscalls.h 2005-07-07 18:23:37 -07:00
ip6_tunnel.h
ip_mp_alg.h
ip.h
ipc.h
ipmi_msgdefs.h
ipmi_smi.h
ipmi.h
ipsec.h
ipv6_route.h
ipv6.h
ipx.h
irda.h
irq_cpustat.h
irq.h [PATCH] irqpoll 2005-06-28 21:20:35 -07:00
isapnp.h
isdn_divertif.h
isdn_ppp.h
isdn.h
isdnif.h
isicom.h
iso_fs.h
istallion.h
ite_gpio.h
ixjuser.h
jbd.h
jffs2_fs_i.h
jffs2_fs_sb.h
jffs2.h
jffs.h
jhash.h
jiffies.h
journal-head.h
joystick.h
kallsyms.h
kbd_diacr.h
kbd_kern.h
kd.h
kdev_t.h
kernel_stat.h
kernel.h [PATCH] sched: voluntary kernel preemption 2005-06-25 16:24:45 -07:00
kernelcapi.h
kexec.h [PATCH] kexec code cleanup 2005-06-25 16:24:55 -07:00
key-ui.h
key.h
keyboard.h
keyctl.h
kfifo.h
klist.h
kmalloc_sizes.h
kmod.h
kobj_map.h
kobject_uevent.h
kobject.h
kprobes.h [PATCH] kprobes: fix namespace problem and sparc64 build 2005-07-05 19:19:00 -07:00
kref.h
kthread.h
lapb.h
lcd.h
libata.h
libps2.h
limits.h
linkage.h
linux_logo.h
list.h [PATCH] RCU: clean up a few remaining synchronize_kernel() calls 2005-06-25 16:24:38 -07:00
llc.h
loop.h
lp.h
major.h
matroxfb.h
mbcache.h
mc6821.h
mc146818rtc.h
mca-legacy.h
mca.h
mempolicy.h
mempool.h
meye.h
mii.h
minix_fs.h
miscdevice.h
mm_inline.h
mm.h
mman.h
mmtimer.h
mmzone.h
mod_devicetable.h [PATCH] openfirmware: generate device table for userspace 2005-07-06 12:55:20 -07:00
module.h [PATCH] modules: add version and srcversion to sysfs 2005-06-24 00:06:40 -07:00
moduleloader.h
moduleparam.h
mount.h [PATCH] name_to_dev_t warning fix 2005-07-12 16:00:58 -07:00
mpage.h
mqueue.h
mroute.h
msdos_fs.h
msg.h
mtio.h
mv643xx.h
n_r3964.h
namei.h
namespace.h [PATCH] namespace.c: fix race in mark_mounts_for_expiry() 2005-07-07 18:23:51 -07:00
nbd.h
ncp_fs_i.h
ncp_fs_sb.h
ncp_fs.h
ncp_mount.h
ncp_no.h
ncp.h
net.h
netdevice.h
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netfilter_logging.h
netfilter.h
netlink.h [W1]: Do not use NFLOG netlink number. 2005-07-24 19:30:28 -07:00
netpoll.h
netrom.h
nfs2.h
nfs3.h
nfs4_acl.h
nfs4_mount.h
nfs4.h [PATCH] nfsd4: fix fh_expire_type 2005-06-24 00:06:28 -07:00
nfs_fs_i.h
nfs_fs_sb.h
nfs_fs.h
nfs_idmap.h
nfs_mount.h
nfs_page.h
nfs_xdr.h
nfs.h
nfsacl.h
nfsd_idmap.h [PATCH] knfsd: nfsd4: idmap initialization 2005-06-24 00:06:32 -07:00
nls.h
nmi.h
node.h
nodemask.h
notifier.h
nubus.h
numa.h
nvram.h [PATCH] drivers/char/nvram.c: possible cleanups 2005-06-25 16:25:03 -07:00
openprom_fs.h
oprofile.h
page-flags.h
pagemap.h
pagevec.h
param.h
parport_pc.h
parport.h
parser.h
patchkey.h
pci_ids.h [PATCH] i4l: add Olitec ISDN PCI card in hisax gazel driver 2005-07-27 16:25:51 -07:00
pci-acpi.h
pci.h [PATCH] PCI: clean up dynamic pci id logic 2005-07-01 13:35:50 -07:00
pcieport_if.h
percpu_counter.h
percpu.h
personality.h
pfkeyv2.h
pg.h
phonedev.h
pid.h
pipe_fs_i.h
pkt_cls.h [NETLINK]: Missing padding fields in dumped structures 2005-06-28 12:56:45 -07:00
pkt_sched.h [NETLINK]: Missing padding fields in dumped structures 2005-06-28 12:56:45 -07:00
pktcdvd.h
platform.h
pm.h [ACPI] merge acpi-2.6.12 branch into latest Linux 2.6.13-rc... 2005-07-12 17:21:56 -04:00
pmu.h [PATCH] ppc32: Remove CONFIG_PMAC_PBOOK 2005-06-27 15:11:43 -07:00
pnp.h
pnpbios.h
poll.h
posix_acl_xattr.h
posix_acl.h
posix_types.h
posix-timers.h
ppdev.h
ppp_channel.h
ppp_defs.h
ppp-comp.h
prctl.h
preempt.h
prefetch.h
prio_tree.h
proc_fs.h [PATCH] kdump: Access dump file in elf format (/proc/vmcore) 2005-06-25 16:24:53 -07:00
profile.h
ps2esdi.h
ptrace.h
qic117.h
qnx4_fs.h [PATCH] fs/qnx4/*: fix sparse warnings 2005-06-24 14:14:24 -07:00
qnxtypes.h [PATCH] fs/qnx4/*: fix sparse warnings 2005-06-24 14:14:24 -07:00
quota.h
quotaio_v1.h
quotaio_v2.h
quotaops.h
radeonfb.h
radix-tree.h
ramfs.h
random.h
raw.h
rbtree.h
rcupdate.h
reboot_fixups.h
reboot.h [PATCH] Add emergency_restart() 2005-07-26 14:35:41 -07:00
reiserfs_acl.h reiserfs: run scripts/Lindent on reiserfs code 2005-07-12 20:21:28 -07:00
reiserfs_fs_i.h reiserfs: run scripts/Lindent on reiserfs code 2005-07-12 20:21:28 -07:00
reiserfs_fs_sb.h reiserfs: run scripts/Lindent on reiserfs code 2005-07-12 20:21:28 -07:00
reiserfs_fs.h reiserfs: run scripts/Lindent on reiserfs code 2005-07-12 20:21:28 -07:00
reiserfs_xattr.h reiserfs: run scripts/Lindent on reiserfs code 2005-07-12 20:21:28 -07:00
resource.h
rmap.h [PATCH] xip: fs/mm: execute in place 2005-06-24 00:06:41 -07:00
romfs_fs.h
root_dev.h
rose.h
route.h
rslib.h
rtc.h
rtnetlink.h [NETLINK]: Missing padding fields in dumped structures 2005-06-28 12:56:45 -07:00
rwsem-spinlock.h
rwsem.h
sc26198.h
scatterlist.h
scc.h
sched.h [PATCH] inotify 2005-07-12 20:38:38 -07:00
sctp.h
scx200_gpio.h
scx200.h
sdla_asy.h
sdla_chdlc.h
sdla_fr.h
sdla_ppp.h
sdla_x25.h
sdla.h
sdladrv.h
sdlapci.h
sdlasfm.h
seccomp.h [PATCH] seccomp: tsc disable 2005-06-27 15:11:44 -07:00
securebits.h
security.h
selection.h
selinux_netlink.h
sem.h
seq_file.h
seqlock.h
serial167.h
serial_8250.h [PATCH] Serial: Split 8250 port table 2005-06-27 11:12:54 +01:00
serial_core.h [PATCH] Serial: Move deprecation of register_serial forward to September 2005-07-16 09:30:53 +01:00
serial_reg.h
serial.h [PATCH] Serial: Move deprecation of register_serial forward to September 2005-07-16 09:30:53 +01:00
serialP.h [PATCH] Serial: Remove linux/version.h 2005-07-16 09:59:00 +01:00
serio.h
shm.h
shmem_fs.h
signal.h
skbuff.h [NET]: Fix "nocast type" warnings in skbuff.h 2005-07-18 13:36:38 -07:00
slab.h [PATCH] Really __nocast-annotate kmalloc_node() 2005-07-27 16:25:47 -07:00
smb_fs_i.h
smb_fs_sb.h
smb_fs.h
smb_mount.h
smb.h
smbno.h
smp_lock.h
smp.h
snmp.h
socket.h
sockios.h
som.h
sonet.h
sonypi.h
sort.h
sound.h
soundcard.h
spinlock.h
stallion.h
stat.h
statfs.h
stddef.h
stop_machine.h
string.h [PATCH] propagate __nocast annotations 2005-07-07 18:23:46 -07:00
stringify.h
superhyway.h
suspend.h [PATCH] suspend/resume SMP support 2005-06-25 16:24:32 -07:00
swap.h [PATCH] tlb.h warning fix 2005-07-12 16:01:02 -07:00
swapops.h
synclink.h
sys.h
syscalls.h [PATCH] move ioprio syscalls into syscalls.h 2005-07-07 18:23:37 -07:00
sysctl.h [PATCH] s390: spin lock retry 2005-07-27 16:26:04 -07:00
sysdev.h
sysfs.h
sysrq.h
sysv_fs.h
tcp_diag.h
tcp.h [TCP]: Move to new TSO segmenting scheme. 2005-07-05 15:24:38 -07:00
telephony.h
termios.h
textsearch_fsm.h
textsearch.h
thread_info.h
threads.h
ticable.h
time.h
timer.h
times.h
timex.h
tiocl.h
topology.h [PATCH] sched: sched tuning 2005-06-25 16:24:42 -07:00
toshiba.h
transport_class.h
trdevice.h
tty_driver.h
tty_flip.h
tty_ldisc.h
tty.h
types.h
udf_fs_i.h
udf_fs_sb.h
udf_fs.h
udp.h
ufs_fs_i.h
ufs_fs_sb.h
ufs_fs.h
uinput.h
uio.h
ultrasound.h
umem.h
un.h
unistd.h
usb_cdc.h [PATCH] USB: another cdc descriptor 2005-07-12 11:52:57 -07:00
usb_ch9.h [PATCH] headers: include linux/types.h for usb_ch9.h 2005-06-28 21:20:32 -07:00
usb_gadget.h [PATCH] USB: Fix kmalloc's flags type in USB 2005-07-12 11:52:56 -07:00
usb_gadgetfs.h
usb_isp116x.h [PATCH] USB: Add isp116x-hcd USB host controller driver 2005-06-27 14:43:42 -07:00
usb_otg.h
usb_sl811.h
usb.h [PATCH] USB: Fix kmalloc's flags type in USB 2005-07-12 11:52:56 -07:00
usbdevice_fs.h
user.h
utime.h
uts.h
utsname.h
vermagic.h
vfs.h
via.h
video_decoder.h
video_encoder.h
videodev2.h [PATCH] V4L: API new webcam formats included 2005-06-28 21:20:36 -07:00
videodev.h
videotext.h
vmalloc.h
vt_buffer.h
vt_kern.h
vt.h
wait.h
wanpipe.h
wanrouter.h [NET]: __be'ify *_type_trans() 2005-07-12 12:08:43 -07:00
watchdog.h [PATCH] consolidate CONFIG_WATCHDOG_NOWAYOUT handling 2005-07-27 16:25:54 -07:00
wavefront.h
wireless.h
workqueue.h
writeback.h [PATCH] rename wakeup_bdflush to wakeup_pdflush 2005-06-28 21:20:31 -07:00
x25.h
xattr.h
xfrm.h
yam.h
zconf.h
zftape.h
zlib.h
zorro_ids.h
zorro.h
zutil.h