• Miklos Szeredi's avatar
    [PATCH] fuse: fix hang on SMP · 6c7e1a3d
    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 avatarGreg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: default avatarChris Wright <chrisw@sous-sol.org>
    6c7e1a3d
file.c 18.7 KB