diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-10-17 00:10:06 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-17 08:18:45 -0700 |
commit | 9ffbb9162312fd8113037cb3d94f787f06bbfa9a (patch) | |
tree | a8194bb542dcda56271b44d7de23f2a72ecac900 /include/asm-m32r/pgtable-2level.h | |
parent | 48d1a7ea6373337985f27dc1c707649469df5827 (diff) | |
download | blackbird-op-linux-9ffbb9162312fd8113037cb3d94f787f06bbfa9a.tar.gz blackbird-op-linux-9ffbb9162312fd8113037cb3d94f787f06bbfa9a.zip |
[PATCH] fuse: fix hang on SMP
Fuse didn't always call i_size_write() with i_mutex held which caused rare
hangs on SMP/32bit. This bug has been present since fuse-2.2, well before
being merged into mainline.
The simplest solution is to protect i_size_write() with the per-connection
spinlock. Using i_mutex for this purpose would require some restructuring of
the code and I'm not even sure it's always safe to acquire i_mutex in all
places i_size needs to be set.
Since most of vmtruncate is already duplicated for other reasons, duplicate
the remaining part as well, making all i_size_write() calls internal to fuse.
Using i_size_write() was unnecessary in fuse_init_inode(), since this function
is only called on a newly created locked inode.
Reported by a few people over the years, but special thanks to Dana Henriksen
who was persistent enough in helping me debug it.
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/asm-m32r/pgtable-2level.h')
0 files changed, 0 insertions, 0 deletions