• Tejun Heo's avatar
    fuse: fix congested state leak on aborted connections · 02832578
    Tejun Heo authored
    commit 8a301eb1 upstream.
    
    If a connection gets aborted while congested, FUSE can leave
    nr_wb_congested[] stuck until reboot causing wait_iff_congested() to
    wait spuriously which can lead to severe performance degradation.
    
    The leak is caused by gating congestion state clearing with
    fc->connected test in request_end().  This was added way back in 2009
    by 26c36791 ("fuse: destroy bdi on umount").  While the commit
    description doesn't explain why the test was added, it most likely was
    to avoid dereferencing bdi after it got destroyed.
    
    Since then, bdi lifetime rules have changed many times and now we're
    always guaranteed to have access to the bdi while the superblock is
    alive (fc->sb).
    
    Drop fc->connected conditional to avoid leaking congestion states.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarJoshua Miller <joshmiller@fb.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: stable@vger.kernel.org # v2.6.29+
    Acked-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    02832578
dev.c 51.3 KB