David Howells
1bccf513ac
FS-Cache: Fix lock misorder in fscache_write_op()
...
FS-Cache has two structs internally for keeping track of the internal state of
a cached file: the fscache_cookie struct, which represents the netfs's state,
and fscache_object struct, which represents the cache's state. Each has a
pointer that points to the other (when both are in existence), and each has a
spinlock for pointer maintenance.
Since netfs operations approach these structures from the cookie side, they get
the cookie lock first, then the object lock. Cache operations, on the other
hand, approach from the object side, and get the object lock first. It is not
then permitted for a cache operation to get the cookie lock whilst it is
holding the object lock lest deadlock occur; instead, it must do one of two
things:
(1) increment the cookie usage counter, drop the object lock and then get both
locks in order, or
(2) simply hold the object lock as certain parts of the cookie may not be
altered whilst the object lock is held.
It is also not permitted to follow either pointer without holding the lock at
the end you start with. To break the pointers between the cookie and the
object, both locks must be held.
fscache_write_op(), however, violates the locking rules: It attempts to get the
cookie lock without (a) checking that the cookie pointer is a valid pointer,
and (b) holding the object lock to protect the cookie pointer whilst it follows
it. This is so that it can access the pending page store tree without
interference from __fscache_write_page().
This is fixed by splitting the cookie lock, such that the page store tracking
tree is protected by its own lock, and checking that the cookie pointer is
non-NULL before we attempt to follow it whilst holding the object lock.
The new lock is subordinate to both the cookie lock and the object lock, and so
should be taken after those.
Signed-off-by: David Howells <dhowells@redhat.com>
2009-11-19 18:11:25 +00:00
..
caching
FS-Cache: Fix lock misorder in fscache_write_op()
2009-11-19 18:11:25 +00:00
configfs
docsrc: build Documentation/ sources
2008-08-12 16:07:30 -07:00
pohmelfs
Staging: Pohmelfs: Added IO permissions and priorities.
2009-04-17 11:06:30 -07:00
00-INDEX
update Documentation/filesystems/00-INDEX with new nfsd related docs.
2009-04-28 12:54:45 -04:00
9p.txt
9p: Update documentation to add fscache related bits
2009-09-23 13:03:46 -05:00
adfs.txt
Fix typos in /Documentation : 'U-Z'
2006-11-30 04:58:40 +01:00
affs.txt
afs.txt
AFS: Documentation updates
2009-08-19 10:40:13 -07:00
autofs4-mount-control.txt
trivial: Miscellaneous documentation typo fixes
2009-06-12 18:01:47 +02:00
automount-support.txt
VFS: Unexport do_kern_mount() and clean up simple_pin_fs()
2006-06-09 09:34:16 -04:00
befs.txt
Fix typos in Documentation/: 'Q'-'R'
2006-10-03 22:54:15 +02:00
bfs.txt
remove mention of CONFIG_KMOD from documentation
2008-07-22 19:24:29 +10:00
btrfs.txt
Btrfs: Add Documentation/filesystem/btrfs.txt, remove old COPYING
2009-01-07 09:54:24 -05:00
cifs.txt
coda.txt
cramfs.txt
debugfs.txt
Document the debugfs API
2009-06-06 10:28:14 -06:00
dentry-locking.txt
devpts.txt
Document usage of multiple-instances of devpts
2009-01-02 10:19:36 -08:00
directory-locking
Documentation: Fix up docs still talking about i_sem
2007-05-24 10:16:17 -07:00
dlmfs.txt
Fix typos in Documentation/: 'D'-'E'
2006-10-03 22:47:42 +02:00
dnotify.txt
Documentation: move dnotify.txt to filesystems/
2008-02-07 08:42:17 -08:00
ecryptfs.txt
eCryptfs: Move ecryptfs docs into Documentation/filesystems/
2007-07-17 10:23:08 -07:00
exofs.txt
exofs: Documentation
2009-03-31 19:44:38 +03:00
Exporting
exportfs: update documentation
2007-10-22 08:13:21 -07:00
ext2.txt
Doc fix: ext2 can only have 32,000 subdirs, not 32,768
2009-06-18 13:03:44 -07:00
ext3.txt
ext3: Update documentation about ext3 quota mount options
2009-10-13 00:06:43 +02:00
ext4.txt
Revert "ext4: Remove journal_checksum mount option and enable it by default"
2009-11-02 10:15:27 -08:00
fiemap.txt
trivial: Miscellaneous documentation typo fixes
2009-06-12 18:01:47 +02:00
files.txt
fix f_count description in Documentation/filesystems/files.txt
2008-12-31 18:07:42 -05:00
fuse.txt
[PATCH] fuse: fix typo
2006-12-30 10:56:45 -08:00
gfs2-glocks.txt
GFS2: Update docs
2009-05-19 10:23:23 +01:00
gfs2-uevents.txt
GFS2: Add a document explaining GFS2's uevents
2009-08-17 11:11:41 +01:00
gfs2.txt
GFS2: Update docs
2009-05-19 10:23:23 +01:00
hfs.txt
hfsplus.txt
Documentation: document HFSPlus
2007-07-31 15:39:38 -07:00
hpfs.txt
misc doc and kconfig typos
2007-05-09 08:58:15 +02:00
inotify.txt
[PATCH] inotify (5/5): update kernel documentation
2006-06-20 05:25:19 -04:00
isofs.txt
isofs: let mode and dmode mount options override rock ridge mode setting
2009-06-18 13:03:45 -07:00
jfs.txt
JFS: document uid, gid, and umask mount options in jfs.txt
2007-03-09 10:27:31 -06:00
knfsd-stats.txt
Document /proc/fs/nfsd/pool_stats
2009-03-27 19:24:27 -04:00
Locking
update Documentation/filesystems/Locking
2009-06-24 08:15:25 -04:00
locks.txt
Documentation: move locks.txt in filesystems/
2007-10-09 18:32:45 -04:00
mandatory-locking.txt
locks: add warning about mandatory locking races
2007-10-09 18:32:45 -04:00
ncpfs.txt
ncpfs: remove dead URL from documentation
2009-09-23 07:39:42 -07:00
nfs-rdma.txt
trivial: Miscellaneous documentation typo fixes
2009-06-12 18:01:47 +02:00
nfs.txt
NFS: Add a dns resolver for use with NFSv4 referrals and migration
2009-08-19 18:22:15 -04:00
nfs41-server.txt
nfsd: revise 4.1 status documentation
2009-09-21 11:13:45 -04:00
nfsroot.txt
trivial: fix typo "for for" in multiple files
2009-09-21 15:14:54 +02:00
nilfs2.txt
nilfs2: modify list of unsupported features in caveats
2009-06-10 23:41:11 +09:00
ntfs.txt
NTFS: update homepage
2008-09-02 19:21:37 -07:00
ocfs2.txt
ocfs2: add mount option and Kconfig option for acl
2009-01-05 08:36:52 -08:00
omfs.txt
omfs: add filesystem documentation
2008-07-26 12:00:05 -07:00
porting
iget: remove iget() and the read_inode() super op as being obsolete
2008-02-07 08:42:29 -08:00
proc.txt
ext4: Use tracepoints for mb_history trace file
2009-09-30 00:32:42 -04:00
quota.txt
quota: documentation for sending "below quota" messages via netlink and tiny doc update
2008-08-12 16:07:27 -07:00
ramfs-rootfs-initramfs.txt
Trivial Documentation/filesystems/ramfs-rootfs-initramfs.txt fix
2008-11-30 11:40:56 -08:00
relay.txt
relay: add buffer-only channels; useful for early logging
2008-07-26 12:00:04 -07:00
romfs.txt
rpc-cache.txt
Documentation: move rpc-cache.txt to filesystems/
2008-04-11 13:20:52 -06:00
seq_file.txt
Doc: seq_file.txt fix wrong dd command example.
2009-09-10 14:33:35 -06:00
sharedsubtree.txt
doc/filesystems: more mount cleanups
2009-09-24 07:20:57 -07:00
smbfs.txt
spufs.txt
Fix typos in /Documentation : 'U-Z'
2006-11-30 04:58:40 +01:00
squashfs.txt
Squashfs: fix documentation typo, Cramfs filesystem limit is 256 MiB
2009-03-05 00:40:13 +00:00
sysfs-pci.txt
trivial: Miscellaneous documentation typo fixes
2009-06-12 18:01:47 +02:00
sysfs.txt
driver core: documentation: make it clear that sysfs is optional
2009-07-28 13:45:23 -07:00
sysv-fs.txt
[PATCH] fs/sysv/: doc cleanup
2006-12-07 08:39:44 -08:00
tmpfs.txt
hugh: update email address
2009-05-21 13:14:32 -07:00
ubifs.txt
UBIFS: remove fast unmounting
2009-01-29 16:34:30 +02:00
udf.txt
udf: implement mode and dmode mounting options
2009-04-02 12:29:50 +02:00
ufs.txt
[PATCH] ufs2 write: mount as rw
2007-02-12 09:48:40 -08:00
vfat.txt
vfat: change the default from shortname=lower to shortname=mixed
2009-08-01 21:35:25 +09:00
vfs.txt
HWPOISON: Define a new error_remove_page address space op for async truncation
2009-09-16 11:50:13 +02:00
xfs.txt
[XFS] remove restricted chown parameter from xfs linux
2008-10-30 18:30:09 +11:00
xip.txt
DOC: update xip method info
2008-11-12 17:17:17 -08:00