]> git.karo-electronics.de Git - karo-tx-linux.git/commit
fuse: fix hang on SMP
authorMiklos Szeredi <miklos@szeredi.hu>
Thu, 4 Jan 2007 00:14:06 +0000 (01:14 +0100)
committerAdrian Bunk <bunk@stusta.de>
Thu, 4 Jan 2007 00:14:06 +0000 (01:14 +0100)
commit571525bb8f82493d0332aa8e31776a9fdc607b3b
treec23faa99bbd088ee1576745239b63ff51359a015
parente79366b5564af42aa2449042c75630c16edbdb4d
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.

Adrian Bunk:
Backported to 2.6.16.

Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
fs/fuse/dir.c
fs/fuse/file.c
fs/fuse/inode.c