original_kernel/fs/ocfs2
Miklos Szeredi 7bfac9ecf0 splice: fix deadlock in splicing to file
There's a possible deadlock in generic_file_splice_write(),
splice_from_pipe() and ocfs2_file_splice_write():

 - task A calls generic_file_splice_write()
 - this calls inode_double_lock(), which locks i_mutex on both
   pipe->inode and target inode
 - ordering depends on inode pointers, can happen that pipe->inode is
   locked first
 - __splice_from_pipe() needs more data, calls pipe_wait()
 - this releases lock on pipe->inode, goes to interruptible sleep
 - task B calls generic_file_splice_write(), similarly to the first
 - this locks pipe->inode, then tries to lock inode, but that is
   already held by task A
 - task A is interrupted, it tries to lock pipe->inode, but fails, as
   it is already held by task B
 - ABBA deadlock

Fix this by explicitly ordering locks: the outer lock must be on
target inode and the inner lock (which is later unlocked and relocked)
must be on pipe->inode.  This is OK, pipe inodes and target inodes
form two nonoverlapping sets, generic_file_splice_write() and friends
are not called with a target which is a pipe.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Acked-by: Mark Fasheh <mfasheh@suse.com>
Acked-by: Jens Axboe <jens.axboe@oracle.com>
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-04-07 08:34:46 -07:00
..
cluster
dlm ocfs2/dlm: Tweak mle_state output 2009-04-03 11:39:25 -07:00
Kconfig
Makefile
acl.c
acl.h
alloc.c ocfs2: Add a name indexed b-tree to directory inodes 2009-04-03 11:39:15 -07:00
alloc.h ocfs2: Add a name indexed b-tree to directory inodes 2009-04-03 11:39:15 -07:00
aops.c ocfs2: Pagecache usage optimization on ocfs2 2009-04-03 11:39:26 -07:00
aops.h
blockcheck.c
blockcheck.h
buffer_head_io.c
buffer_head_io.h
dcache.c
dcache.h
dir.c ocfs2: fix leaf start calculation in ocfs2_dx_dir_rebalance() 2009-04-03 11:39:17 -07:00
dir.h ocfs2: Introduce dir free space list 2009-04-03 11:39:16 -07:00
dlmglue.c ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
dlmglue.h ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
export.c ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
export.h
extent_map.c
extent_map.h
file.c splice: fix deadlock in splicing to file 2009-04-07 08:34:46 -07:00
file.h
heartbeat.c
heartbeat.h
inode.c ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
inode.h ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
ioctl.c
ioctl.h
journal.c ocfs2: recover orphans in offline slots during recovery and mount 2009-04-03 11:39:26 -07:00
journal.h ocfs2: recover orphans in offline slots during recovery and mount 2009-04-03 11:39:26 -07:00
localalloc.c ocfs2: Remove debugfs file local_alloc_stats 2009-04-03 11:39:15 -07:00
localalloc.h
locks.c
locks.h
mmap.c
mmap.h
namei.c ocfs2: Optimize inode allocation by remembering last group 2009-04-03 11:39:17 -07:00
namei.h
ocfs1_fs_compat.h
ocfs2.h ocfs2: recover orphans in offline slots during recovery and mount 2009-04-03 11:39:26 -07:00
ocfs2_fs.h ocfs2: Enable indexed directories 2009-04-03 11:39:16 -07:00
ocfs2_lockid.h ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
ocfs2_lockingver.h
quota.h
quota_global.c
quota_local.c
resize.c
resize.h
slot_map.c
slot_map.h
stack_o2cb.c
stack_user.c
stackglue.c
stackglue.h
suballoc.c ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
suballoc.h ocfs2: fix rare stale inode errors when exporting via nfs 2009-04-03 11:39:25 -07:00
super.c ocfs2: recover orphans in offline slots during recovery and mount 2009-04-03 11:39:26 -07:00
super.h
symlink.c
symlink.h
sysfile.c
sysfile.h
uptodate.c
uptodate.h
ver.c
ver.h
xattr.c ocfs2: Add a name indexed b-tree to directory inodes 2009-04-03 11:39:15 -07:00
xattr.h ocfs2: Add a name indexed b-tree to directory inodes 2009-04-03 11:39:15 -07:00