• Miklos Szeredi's avatar
    [fuse] fix deadlock between fuse_put_super() and request_end() · 73ce8355
    Miklos Szeredi authored
    A deadlock was possible, when the last reference to the superblock was
    held due to a background request containing a file reference.
    
    Releasing the file would release the vfsmount which in turn would
    release the superblock.  Since sbput_sem is held during the fput() and
    fuse_put_super() tries to acquire this same semaphore, a deadlock
    results.
    
    The chosen soltuion is to get rid of sbput_sem, and instead use the
    spinlock to ensure the referenced inodes/file are released only once.
    Since the actual release may sleep, defer these outside the locked
    region, but using local variables instead of the structure members.
    
    This is a much more rubust solution.
    Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
    73ce8355
dev.c 23.5 KB