• Eric Wheeler's avatar
    bcache: register_bcache(): call blkdev_put() when cache_alloc() fails · ef963341
    Eric Wheeler authored
    commit d9dc1702 upstream.
    
    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>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    ef963341
super.c 50.2 KB