• Miklos Szeredi's avatar
    fuse: fix hang on SMP · 571525bb
    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.
    
    Adrian Bunk:
    Backported to 2.6.16.
    Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
    Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
    571525bb
inode.c 17.9 KB