• Eric Wheeler's avatar
    bcache: register_bcache(): call blkdev_put() when cache_alloc() fails · 220360d6
    Eric Wheeler authored
    [ Upstream commit d9dc1702 ]
    
    register_cache() is supposed to return an error string on error so that
    register_bcache() will will blkdev_put and cleanup other user counters,
    but it does not set 'char *err' when cache_alloc() fails (eg, due to
    memory pressure) and thus register_bcache() performs no cleanup.
    
    register_bcache() <----------\  <- no jump to err_close, no blkdev_put()
       |                         |
       +->register_cache()       |  <- fails to set char *err
             |                   |
             +->cache_alloc() ---/  <- returns error
    
    This patch sets `char *err` for this failure case so that register_cache()
    will cause register_bcache() to correctly jump to err_close and do
    cleanup.  This was tested under OOM conditions that triggered the bug.
    Signed-off-by: default avatarEric Wheeler <bcache@linux.ewheeler.net>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
    220360d6
super.c 50.9 KB