• Miklos Szeredi's avatar
    [PATCH] fuse: fix hang on SMP · 9ffbb916
    Miklos Szeredi authored
    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: default avatarMiklos Szeredi <miklos@szeredi.hu>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    9ffbb916
inode.c 16 KB